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


243

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

回答:


199

シェルコマンドとそのコマンドの引数は次のように表示された番号のシェル変数を:$0、のようなものをコマンド自体の文字列値を持つscript./script/home/user/bin/scriptまたは何でも。任意の引数は次のように表示され"$1""$2""$3"ようにと。引数の数はシェル変数にあります"$#"

これに対処する一般的な方法には、シェルコマンドgetoptsshiftgetoptsC getopt()ライブラリ関数によく似ています。to 、to などのshift値を移動します。減少します。コードはの値を調べて、アクションを決定するために… を使用して物事を実行し、次にa を実行して次の引数に移動します。それだけで、これまで検討しているかもしれない、と。$2$1$3$2$#"$1"caseesacshift$1$1$#


6
C getopt()は非常に確立された標準ですが、getopt実行可能ファイルはディストリビューション/プラットフォーム間で同じではありません。getoptsPOSIX標準なので、私は完全に変換されたユーザーです。それは素晴らしい作品とdash私の好適スクリプトシェルである、また
JMベッカー

165

$nwhere 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

27
$/shellscriptname.sh argument1 argument2 argument3 

また、あるシェルスクリプトの出力を引数として別のシェルスクリプトに渡すこともできます。

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

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

シェル引数の詳細


18

フォーム

$ ./script.sh "$@" 

はに最も便利ですargv。arg区切り文字は空白ですが、変更できます。どれほど手違いかを覚えてはいけません。次に使用する

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

フローを制御します。case ... esac意志が十分であれば、通常getoptsを受け入れません。


14

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"

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

$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ ./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

$ ./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


5

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

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

詳細は、http: //heirloom.sourceforge.net/sh/sh.1.htmlのシェル(sh)マニュアルに記載されています。


2
U&Lへようこそ、これはすでに与えられた答えにほとんど何も追加しません。
アーケマー


0
#!/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

3
1)不要2> /dev/null、2)既存の回答に何も追加しません。
ゼノイド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.