2017-12-22 4 views
0

渡す引数:ここ 関数呼び出しの結果フラグと、私はこのように現在のスクリプトを更新したいと思います

$ example.sh a b 

は、それが引数に取る example.sh

for var in "[email protected]" 
do 
    $var 
done 

内のコードがありますそれらの引数はループされて実行されます(これらの引数が存在すると仮定します)。

これらのflagsがスクリプト/関数であり、後のすべてが関数の引数として適用されるようにスクリプトを更新したいと考えています。

$ example.sh --a 1 2 3 --b 4 5 6 

私はすべてのフラグをループして、それに相当するものを実行したいと思います。

a 1 2 3 
b 1 2 3 

私はgetoptsに見ているが、私はそれは私が私が望む方法を実行し、引数に渡すことができるようになりますかどうかわからないです。

while getopts ":a:b:c:d:" opt; do 
    case "$opt" in 
    a) i=$OPTARG ;; 
    b) j=$OPTARG ;; 
    c) k=$OPTARG ;; 
    d) l=$OPTARG ;; 
    esac 
done 

echo $i 
echo $j 

for file in "[email protected]"; do 
    echo $file 
done 

私はexample --a 1 2 3 --b 4 5 6を与えられた次のスクリプトのみOPTARGを使用して最初の項目を割り当てますし、それが正常に動作しませんが見つかりました:私が試した何

。私はこの形式で関数に引数を適用する方法が不明です。

答えて

1

私はあなたが欲しいものを行うための任意の自動的な方法を知りませんが、あなたの引数を通して、あなたはできるだけのループと、このように、あなたのコマンドを構築:

#!/bin/bash 

cmd=() 
while [ $# -gt 0 ]; do       # loop until no args left 
    if [[ $1 = --* ]]; then     # arg starts with -- 
     [[ ${#cmd[@]} -gt 0 ]] && "${cmd[@]}" # execute previous command 
     cmd=("${1#--}")      # start new array 
    else 
     cmd+=("$1")       # append to command 
    fi 
    shift          # remove $1, $2 goes to $1, etc. 
done 

[[ ${#cmd[@]} -gt 0 ]] && "${cmd[@]}"   # run last command 
-1

おそらくこの方法。

猫example.sh

while read line;do 
    $line 
done <<<$(echo [email protected] | sed 's/--/\n/g') 

と私は

./example.sh '--echo 1 2 3 --dc -e 4sili5+p' 

出力

1 2 3 
9 
+0

これは「空白やシェルのワイルドカードまたはが含まれている任意の引数をmisparseしようとしていることをしてみてください - " –

+0

@GordonDavissonはい、それはトップの答えではありませんが、私たちはおそらく私が言うのは、cmdのタイプについて何も知らないからです。 –

関連する問題