Bash
パラメータによるスクリプト
サーチ…
備考
-
shift
、$2
が$1
、$3
が$2
なるように位置パラメーターを左にシフトします。 -
"$@"
は、スクリプト/関数に渡されるすべての位置パラメータの配列です。 -
"$*"
は、スクリプト/関数に渡されるすべての位置パラメータで構成される文字列です。
複数パラメータの解析
多くのパラメーターを解析するには、 whileループ、 caseステートメント、およびシフトを使用することをお勧めします。
shift
は、シリーズの最初のパラメータをポップするために使用され、以前は$ 2だったものが$ 1になりました 。これは、引数を一度に1つずつ処理する場合に便利です。
#!/bin/bash
# Load the user defined parameters
while [[ $# > 0 ]]
do
case "$1" in
-a|--valueA)
valA="$2"
shift
;;
-b|--valueB)
valB="$2"
shift
;;
--help|*)
echo "Usage:"
echo " --valueA \"value\""
echo " --valueB \"value\""
echo " --help"
exit 1
;;
esac
shift
done
echo "A: $valA"
echo "B: $valB"
入力と出力
$ ./multipleParams.sh --help
Usage:
--valueA "value"
--valueB "value"
--help
$ ./multipleParams.sh
A:
B:
$ ./multipleParams.sh --valueB 2
A:
B: 2
$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2
パラメータへのアクセス
Bashスクリプトを実行すると、スクリプトに渡されるパラメータは、その位置に応じて名前が付けられます。 $1
は最初のパラメータの名前、 $2
は2番目のパラメータの名前などです。
欠落しているパラメータは、単に空の文字列に評価されます。パラメータの存在を確認するには、次のようにします。
if [ -z "$1" ]; then
echo "No argument supplied"
fi
すべてのパラメータを取得する
$@
と$*
はすべてのスクリプトパラメータと対話する方法です。 Bashのmanページを参照すると、次のようになります。
-
$*
:1から始まる定位置パラメーターに展開されます。拡張が二重引用符で囲まれると、各パラメータの値をIFS特殊変数の最初の文字で区切って1つの単語に展開します。 -
$@
:1から始まる定位置パラメーターに展開します。展開が二重引用符で囲まれると、各パラメータは別の単語に展開されます。
パラメータ数の取得
$#
は、スクリプトに渡されるパラメータの数を取得します。典型的な使用例は、適切な数の引数が渡されるかどうかをチェックすることです。
if [ $# -eq 0 ]; then
echo "No arguments supplied"
fi
例1
すべての引数をループし、それらがファイルであるかどうかを確認します。
for item in "$@"
do
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
例2
すべての引数をループし、それらがファイルであるかどうかを確認します。
for (( i = 1; i <= $#; ++ i ))
do
item=${@:$i:1}
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
forループを使用した引数解析
オプションを提供する簡単な例:
オプト | Alt。オプト | 詳細 |
---|---|---|
-h | --help | ヘルプを表示 |
-v | --version | バージョン情報を表示する |
-dr path | --doc-root path | セカンダリパラメータ(パス)をとるオプションは、 |
-i | --install | 論理値オプション(true / false) |
-* | - | 無効なオプション |
#!/bin/bash
dr=''
install=false
skip=false
for op in "$@";do
if $skip;then skip=false;continue;fi
case "$op" in
-v|--version)
echo "$ver_info"
shift
exit 0
;;
-h|--help)
echo "$help"
shift
exit 0
;;
-dr|--doc-root)
shift
if [[ "$1" != "" ]]; then
dr="${1/%\//}"
shift
skip=true
else
echo "E: Arg missing for -dr option"
exit 1
fi
;;
-i|--install)
install=true
shift
;;
-*)
echo "E: Invalid option: $1"
shift
exit 1
;;
esac
done
ラッパースクリプト
Wrapperスクリプトは、別のスクリプトやコマンドをラップして余分な機能を提供するスクリプトです。
例えば、実際egrep
新しいGNU / Linuxシステムでは、名前のラッパースクリプトによって置き換えられているegrep
。これは見た目です:
#!/bin/sh
exec grep -E "$@"
したがって、このようなシステムでegrep
を実行すると、実際にはすべての引数が転送された状態でgrep -E
が実行されます。
一般的なケースでは、別のスクリプトmexmp
exmp
てサンプルスクリプト/コマンドexmp
を実行する場合、ラッパーmexmp
スクリプトは次のようになります:
#!/bin/sh
exmp "$@" # Add other options before "$@"
# or
#full/path/to/exmp "$@"
文字列をBashの配列に分割する
Stringパラメータがあり、カンマで区切りたいとしましょう
my_param="foo,bar,bash"
この文字列をカンマで区切るには、使用できます。
IFS=',' read -r -a array <<< "$my_param"
ここで、IFSは、 内部フィールドセパレータと呼ばれる特殊な変数で、一部の操作でパターンをトークンに分割するために使用される文字を定義します。
個々の要素にアクセスするには:
echo "${array[0]}"
要素を反復処理するには:
for element in "${array[@]}"
do
echo "$element"
done
インデックスと値の両方を取得するには:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done