コマンドライン引数をbashスクリプト配列に変換するにはどうすればよいですか?
私はこれを取りたいです:
./something.sh arg1 arg2 arg3
に変換します
myArray=( arg1 arg2 arg3 )
そのため、スクリプトでさらに使用するためにmyArrayを使用できます。
この前のSO投稿は近づいていますが、配列の作成方法には入りません: Bashでコマンドライン引数を解析するにはどうすればよいですか?
引数を通常のbashスクリプト配列に変換する必要があります。私は他の言語(たとえば、Python)を使用できますが、bashでこれを行う必要があることを認識しています。 「追加」機能などを探しているのでしょうか?
更新:また、引数なしをチェックしてデフォルトの配列値を割り当てる方法を尋ねたいと思いましたが、以下の答えのおかげで、これを動作させることができました:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
実際には、コマンドライン引数は実際には配列のようです。少なくとも、$@
変数を配列のように扱うことができます。ただし、次のように実際の配列に変換できます。
myArray=( "$@" )
いくつかの引数を入力して$@
値に入力するだけの場合は、set
を使用します。
$ set -- Apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
Apple banana kiwi fruit
引数構造の使用方法を理解することは、POSIX shでは特に役立ちます。POSIXshには配列のようなものはありません。
たぶんこれは助けることができます:
myArray=("$@")
また、「in」を省略して引数を反復処理することもできます。
for arg; do
echo "$arg"
done
同等になります
for arg in "${myArray[@]}"; do
echo "$arg"
done
実際、パラメータのリストには$1 $2 ...
などでアクセスできます。
これは次のものとまったく同じです。
${!i}
したがって、パラメータのリストはsetで変更できますが、
と${!i}
はそれらにアクセスする正しい方法です:
$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll
あなたの特定のケースでは、これは(配列を必要とせずに)使用され、引数が与えられなかったときに引数のリストを設定します:
if [ "$#" -eq 0 ]; then
set -- defaultarg1 defaultarg2
fi
これはさらに簡単な式に変換されます:
[ "$#" == "0" ] && set -- defaultarg1 defaultarg2
簡単ですが、$@
を直接操作できます;)
プロンプトから直接引数のリストを渡す方法は次のとおりです。
function echoarg { for stuff in "$@" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
別の用途は次のとおりです。
#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
配列と$ @が実質的に同じである様子を並べた図。
コード:
#!/bin/bash
echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""
myArray=( "$@" )
echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"
入力:
./bash-array-practice.sh 1 2 3 4
出力:
Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4
A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4
二重引用符の重要性は強調する価値があります。引数に空白が含まれているとします。
コード:
#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=( $@ )
printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
echo "${arrayGOOD[$i-1]}"
done
printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
echo "${arrayBAAD[$i-1]}"
done
出力:
> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and
arguments:the
arguments:mouse.
arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and
the
mouse.
arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
>