web-dev-qa-db-ja.com

コマンドライン引数をシェルスクリプトに渡すにはどうすればよいですか?

シェルスクリプトは、コマンドプロンプトで実行されたかのようにコマンドを実行するだけであることは知っています。シェルスクリプトを関数のように実行できるようにしたい...つまり、スクリプトに入力値または文字列を取り込みます。これを行うにはどうすればよいですか?

295
Paul

シェルコマンドとそのコマンドの引数はnumberedシェル変数として表示されます。$0には、script./script/home/user/bin/scriptなどのコマンド自体の文字列値があります。引数は、"$1""$2""$3"などのように表示されます。引数の数は、シェル変数"$#"にあります。

これに対処する一般的な方法には、シェルコマンドgetoptsおよびshiftが含まれます。 getoptsは、C getopt()ライブラリ関数によく似ています。 shiftは、$2の値を$1に、$3$2に、というように移動します。 $#は減少します。コードは最終的に"$1"の値を調べ、caseesacを使用してアクションを決定し、shiftを実行して$1を次の引数に移動します。 $1、そしておそらく$#を調べればよいだけです。

228
Bruce Ediger

渡された引数には$nを使用してアクセスできます。ここで、nは引数番号-1, 2, 3, ...です。他のコマンドと同じように引数を渡します。

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
205
Kevin

Bashスクリプトでは、個人的に次のスクリプトを使用してパラメーターを設定します。

#!/bin/bash

helpFunction()
{
   echo ""
   echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
   echo -e "\t-a Description of what is parameterA"
   echo -e "\t-b Description of what is parameterB"
   echo -e "\t-c Description of what is parameterC"
   exit 1 # Exit script after printing help
}

while getopts "a:b:c:" opt
do
   case "$opt" in
      a ) parameterA="$OPTARG" ;;
      b ) parameterB="$OPTARG" ;;
      c ) parameterC="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
   echo "Some or all of the parameters are empty";
   helpFunction
fi

# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"

この構造では、それぞれのキー文字を定義しているため、パラメーターの順序に依存しません。また、ヘルプ機能は、パラメーターが誤って定義されるたびに出力されます。処理するパラメーターが異なるスクリプトが多数ある場合に非常に便利です。次のように機能します。

$ bash myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ bash myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ bash myscript -a "String A" -c "String C" -f "Non-existent parameter"
myscript: illegal option -- f

Usage: myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

$ bash myscript -a "String A" -c "String C"
Some or all of the parameters are empty

Usage: myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC
34
Rafael Muynarsk
$/shellscriptname.sh argument1 argument2 argument3 

1つのシェルスクリプトの出力を別のシェルスクリプトの引数として渡すこともできます。

$/shellscriptname.sh "$(secondshellscriptname.sh)"

シェルスクリプト内では、最初の引数の場合は$1、2番目の引数の場合は$2などの番号を持つ引数にアクセスできます。

シェル引数の詳細

32

フォーム

$ ./script.sh "$@" 

argvに最も便利です。引数の区切り文字は空白ですが、変更できます。いかに手に負えないか覚えていない。次に使用します

 $1, $2, shift, if [ $# -ne 3 ] 

フローを制御します。 case ... esacで十分であれば、私は通常getoptsを採用しません。

21
user400344
./myscript myargument

myargumentmyscript内で$1になります。

14
vimdude

シェルスクリプト;変数名は$ 1になります。 2番目のWordは変数名$ 2になります。

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world

もっと多分シェル(sh)マニュアル http://heirloom.sourceforge.net/sh/sh.1.html にあります

8
FireInTheSky

Python argparseに精通していて、pythonを呼び出してbash引数を解析することを気にしない場合は、bash argparse( https:/ /github.com/mattbryson/bash-arg-parse )、

ここで同じ答えを参照してください: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287

1
Linh
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2
0
Yogesh

以下は私のものです:

#!/bin/bash 
echo 'First arg:' $1 
echo 'Second arg:' $2 

シェル名はpara_script.shです。

次にそれを実行します:./para_script.sh hello world

0
Newt