web-dev-qa-db-ja.com

Bashシェルスクリプト内の入力引数の存在を確認する

入力引数の存在を確認する必要があります。次のスクリプトがあります

if [ "$1" -gt "-1" ]
  then echo hi
fi

私は

[: : integer expression expected

最初に入力引数1が存在するかどうかを確認するにはどうすればよいですか。

1086
user775187

それは:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

$#変数はスクリプトが渡された入力引数の数を教えてくれます。

あるいは、引数が空文字列かどうかをチェックすることもできます。

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

-zスイッチは、 "$ 1"の展開がNULL文字列かどうかをテストします。それがNULL文字列であれば、本体が実行されます。

1904
phoxis

このようにして実証することをお勧めします

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

引数が少なすぎる場合は通常終了する必要があります。

282
Val

場合によっては、ユーザーがスクリプトに引数を渡したかどうかを確認し、そうでない場合はデフォルト値に戻す必要があります。以下のスクリプトのように:

scale=${2:-1}
emulator @$1 -scale $scale

ユーザーが2番目のパラメータとしてscaleを渡さなかった場合は、デフォルトで-scale 1を指定してAndroidエミュレータを起動します。 ${varname:-Word}は展開演算子です。他の展開演算子もあります。

  • ${varname:=Word} which setsvarnameの値を返す代わりに未定義のWord
  • ${varname:?message}は、定義されていてnullでない場合はvarnameを返すか、messageを出力してスクリプトを中止します(最初の例のように)。
  • Wordが定義されていてnullではない場合に限り、varnameを返す${varname:+Word}。それ以外の場合はnullを返します。
90
Aleks N.

試してください:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi
37
Ranjithkumar T

引数がスクリプトに渡されたかどうかを検出するもう1つの方法:

((!$#)) && echo No arguments supplied!

(( expr ))を指定すると、 シェル演算 の規則に従って式が評価されます。

引数がない状態で終了するには、次のように言うことができます。

((!$#)) && echo No arguments supplied! && exit 1

上記の別の (類似) の言い方は、

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help letは言う:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
32
devnull

私はこのスニペットを単純なスクリプトによく使用します。

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi
18
f2cx

もう少し指摘しておく必要があるのは、単に文字列がnullであることをテストできるということです。

if [ "$1" ]; then
  echo yes
else
  echo no
fi

同様にarg countを期待しているのなら、最後のものをテストしてください。

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

など、任意のargまたはvar

8
seorphates

引数が存在するかどうかを確認したい場合は、引数の数がターゲット引数番号以上であるかどうかを確認できます。

次のスクリプトは、これがどのように機能するかを示しています

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

次のような出力を生成します。

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
3
Brad Parks

ちなみに、Bashの数値テスト演算子は整数(-eq-lt-geなど)に対してのみ機能します。

私は自分の$ varがintであることを確認するのが好きです

var=$(( var + 0 ))

テストする前に、 "[:integer arg required"エラーを防ぐためだけに使用します。

3
Cwissy