シェルスクリプトは、コマンドプロンプトで実行されたかのようにコマンドを実行するだけであることは知っています。シェルスクリプトを関数のように実行できるようにしたい...つまり、スクリプトに入力値または文字列を取り込みます。これを行うにはどうすればよいですか?
シェルコマンドとそのコマンドの引数はnumberedシェル変数として表示されます。$0
には、script
、./script
、/home/user/bin/script
などのコマンド自体の文字列値があります。引数は、"$1"
、"$2"
、"$3"
などのように表示されます。引数の数は、シェル変数"$#"
にあります。
これに対処する一般的な方法には、シェルコマンドgetopts
およびshift
が含まれます。 getopts
は、C getopt()
ライブラリ関数によく似ています。 shift
は、$2
の値を$1
に、$3
を$2
に、というように移動します。 $#
は減少します。コードは最終的に"$1"
の値を調べ、case
…esac
を使用してアクションを決定し、shift
を実行して$1
を次の引数に移動します。 $1
、そしておそらく$#
を調べればよいだけです。
渡された引数には$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
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
$/shellscriptname.sh argument1 argument2 argument3
1つのシェルスクリプトの出力を別のシェルスクリプトの引数として渡すこともできます。
$/shellscriptname.sh "$(secondshellscriptname.sh)"
シェルスクリプト内では、最初の引数の場合は$1
、2番目の引数の場合は$2
などの番号を持つ引数にアクセスできます。
フォーム
$ ./script.sh "$@"
argv
に最も便利です。引数の区切り文字は空白ですが、変更できます。いかに手に負えないか覚えていない。次に使用します
$1, $2, shift, if [ $# -ne 3 ]
フローを制御します。 case ... esac
で十分であれば、私は通常getoptsを採用しません。
./myscript myargument
myargument
はmyscript
内で$1
になります。
シェルスクリプト;変数名は$ 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 にあります
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
#!/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
以下は私のものです:
#!/bin/bash
echo 'First arg:' $1
echo 'Second arg:' $2
シェル名はpara_script.shです。
次にそれを実行します:./para_script.sh hello world