web-dev-qa-db-ja.com

Bashスクリプトに渡された引数の数を確認する

必要な引数の数が満たされていない場合は、Bashスクリプトにエラーメッセージを表示させます。

私は次のコードを試してみました:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

いくつかの未知の理由で、私は次のエラーが出ました:

test: line 4: [2: command not found

何がおかしいのですか?

564
Naftaly

他の単純なコマンドと同様に、[ ... ]またはtestでは、引数間にスペースが必要です。

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

または

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Bashでは、Wordの分割や変数へのパス名の展開はしないので、代わりに[[ ]]を使用することをお勧めします。それが式の一部でない限り、引用符は不要な場合があります。

[[ $# -ne 1 ]]

また、引用符で囲まれていない条件のグループ化、パターンマッチング(extglobによる拡張パターンマッチング)、および正規表現マッチングなどの機能もあります。

次の例では、引数が有効かどうかを確認します。 1つか2つの引数を使用できます。

[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

純粋な算術式では、(( ))を使用する方がより良い場合がありますが、[[ ]]-eq-ne-lt-le、または-gtなどの算術演算子で-geで使用することもできます。

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

あなたが[[ ]]の他の機能とそれを組み合わせる必要があるなら、それは役に立つはずです。

参考文献:

858
konsolebox

数値を扱う場合は、 算術式 を使用するのが得策です。

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi

On []:!=、=、== ...は 文字列 比較演算子であり、-eq、-gt ...は 算術 2進数の演算子.

私は使うだろう:

if [ "$#" != "1" ]; then

または

if [ $# -eq 1 ]; then
33
jhvaras

特定の引数が欠けている場合にのみ保釈に興味があるなら、 パラメータ置換 は素晴らしいです:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
27
Pat

うまくいく単純なワンライナーは、次のものを使って実行できます。

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

これは次のように分類されます。

  1. パラメータのサイズがbash変数の$#が1でないことをテストします(サブコマンドの数)
  2. 真の場合、usage()関数を呼び出してステータス1で終了します。
  3. それ以外の場合はmain()関数を呼び出す

注意することを考えています:

  • usage()は単なるエコー "$ 0:params"にすることができます。
  • mainは1つの長いスクリプトにすることができます
12
Dwight Spencer

this bashのチートシートをチェックしてください。

渡された引数の長さを確認するには、"$#"を使用します。

渡された引数の配列を使用するには、"[email protected]"を使用します。

長さをチェックし、反復する例は次のようになります。

myFunc() {
  if [[ "$#" -gt 0 ]]; then
    for arg in "[email protected]"; do
      echo $arg
    done
  fi
}

myFunc "[email protected]"

このアーティキュレートは私を助けました、しかし私と私の状況のた​​めにいくつかのことを見逃していました。うまくいけば、これは誰かに役立ちます。

1
Nick Hall

あなたが安全な側になりたい場合は、getoptsを使用することをお勧めします。 

これは小さな例です。 

    while getopts "x:c" opt; do
      case $opt in
        c)
          echo "-$opt was triggered, deploy to ci account" >&2
          DEPLOY_CI_ACCT="true"
          ;;
            x)
              echo "-$opt was triggered, Parameter: $OPTARG" >&2 
              CMD_TO_EXEC=${OPTARG}
              ;;
            \?)
              echo "Invalid option: -$OPTARG" >&2 
              Usage
              exit 1
              ;;
            :)
              echo "Option -$OPTARG requires an argument." >&2 
              Usage
              exit 1
              ;;
          esac
        done

詳細はこちらを参照してください。 http://wiki.bash-hackers.org/howto/getopts_tutorial

0
IsaacE

テスト条件の間にスペースを入れるべきです:

if [ $# -ne 1 ]; 
    then echo "illegal number of parameters"
fi

これが役に立つことを願っています。

0
Fabricio

ここでは、パラメータが1つだけ与えられているかどうかを確認するための単純なものがスクリプトを終了します。

[ "$#" -ne 1 ] && echo "USAGE $0 <PARAMETER>" && exit
0
panticz.de