2012-10-03 5 views
94

コマンドライン引数をbashスクリプト配列に変換するにはどうすればよいですか?コマンドライン引数をBashの配列に変換する

私はこの取りたい:

./something.sh arg1 arg2 arg3 

を、私はスクリプト内のさらなる使用のためmyarrayのを使用できるように

myArray=(arg1 arg2 arg3) 

に変換します。

この前のSO投稿は近づくが、配列を作成する方法には触れません:How do I parse command line arguments in Bash?

私は通常のbashスクリプト配列に引数を変換する必要があります。私は他の言語(Pythonなど)を使うことができるが、これをbashで行う必要があることを理解している。私は "追加"機能または類似のものを探していると思いますか?

UPDATE:私もゼロの引数をチェックして、デフォルトの配列の値を割り当てる方法をお聞きしたかった、と以下の答えのおかげで、この作業を取得することができました:

if [ "$#" -eq 0 ]; then 
    myArray=(defaultarg1 defaultarg2) 
else 
    myArray=("[email protected]") 
fi 

答えて

126

実際にあなたのコマンドライン引数は実際には配列のようなです。少なくとも、[email protected]変数は配列のように扱うことができます。どのように理解する

$ set -- apple banana "kiwi fruit" 
$ echo "$#" 
3 
$ echo "[email protected]" 
apple banana kiwi fruit 

:あなただけのいくつかの引数を入力し、[email protected]値にそれらを供給する場合

myArray=("[email protected]") 

は、setを使用します。それはあなたがこのような実際の配列に変換することができ、言いました引数の構造体を使うことは、配列のようなものがないPOSIX shで特に有用です。

+1

ありがとうございます!よく働く!ゼロ引数をチェックし、デフォルトの配列値を代入する方法を尋ねるところでしたが、$#は完全に機能します! – Suman

+0

@kojiroセットの意味は何である - 、おかげで – mailzyok

+1

'set'は、スコープの位置パラメータを設定することができます。シェルオプションを設定することもできます。 'set foo'を実行することができます。これは' $ 1'が '' foo ''に展開されることを意味しますが、あなたのパラメータがダッシュで始まるなら '' set''はシェルオプションを設定することを意味します。二重ダッシュは、次のすべてのパラメーターが設定される位置パラメーターとして解釈されるようにします。 – kojiro

35

多分これは助けることができる:

myArray=("[email protected]") 

をまた、あなたが 'で' 省略して引数を反復処理することができます。

for arg; do 
    echo "$arg" 
done 

はここ

for arg in "${myArray[@]}"; do 
    echo "$arg" 
done 
+0

は、私は2番目の – goofansu

+0

初心者の質問素晴らしいですが見つかりました:どのようにbashは 'arg'フィールドに置くために何を知っている - それは事前に定義された変数でありますか? '$ {var}'は 'var'の内容に展開されます。 '$ {var [n]}'は配列 'var'の要素' n'の内容に展開されます。 $ {var [0]} $ {var [1]} ... $ {var [n]} '(' n 'は '最後の要素のインデックス)? – Christian

+0

[for]を指定しないと[in]は引数配列$ @($ 1、$ 2など)をループします。 [set]コマンドでも設定できます。例えば、set-arg1 arg2 –

4

同等になりますが、別の使い方であります:

#!/bin/bash 
array=("[email protected]") 
arraylength=${#array[@]} 
for ((i=1; i<${arraylength}+1; i++)); 
do 
    echo "${array[$i-1]}" 
done 
6

実際には、パラメータ一覧には$1 $2 ...などでアクセスできます。まったく同じです

だから、
${!i} 

は、パラメータのリストは
${!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 

何も与えられなかった場合、特定の場合、この引数のリストを設定するために、(アレイを必要とせずに)使用することができる。

このより簡単な表現に変換

:まだ、あなたは[email protected]上で直接動作することができ

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2 
4

簡単;)ここで

プロンプトから直接、引数のAAリストを渡す行う方法です。

function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; } 
echoarg Hey Ho Lets Go 
    Hey 
    Ho 
    Lets 
    Go 
関連する問題