サーチ…


備考

  • 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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow