2017-01-17 9 views
0

getopts関数を使用して、シェルに与えられた引数の数に応じて何回もコマンドを実行します。私は名前が与えられているような回数を実行するためにechoコマンドを希望
getoptsで指定された変数の数に基づいてシェルコマンドを何度か実行します。

#!/bin/bash 

while getopts "i" flag 
do 
    case "$flag" in 
    i) name="$OPTARG";; 
    esac 
done 
echo $name 


はここscript.shの内容です。たとえば、私が./script.sh -i One, Two, Three, Fourを実行した場合、スクリプトをechoで4回実行し、その名前をシェルに出力します。

+0

'name'を配列にして、オプションを追加します。 –

答えて

2

は、理想的には、あなたは、単にカンマでそれを分割し、-iの引数として単一カンマ区切りの単語を与える(注:原因アレイの使用とreadから-aオプションにbashが必要です)。

while getopts "i:" flag 
do 
    case "$flag" in 
    i) IFS=, read -a names <<< "$OPTARG";; 
    esac 
done 

printf '%s\n' "${names[@]}" 

その後、次の動作するはず:

$ ./script.sh -i One,Two,Three,Four 
One 
Two 
Three 
Four 

getoptsは本当にオプションに任意の数の引数を処理するように設計されていません。

+0

実際、私は質問からコピーされた 'getopts'コマンドを注意深く見ていませんでした。 – chepner

+0

あなたの例は素晴らしいです。もし 'cp file1.txt/path/to/$ names/pictures'のようなものが欲しいのであれば? '$ names'はシェルに与えられたいくつかの異なる名前です。私はあなたのコードに基づいていくつかのことを試みましたが、それを働かせることができませんでした... –

+0

一般に、あなたは単純にそのような引数に配列を置くことはできません。それぞれの要素に対して 'cp'を別々に実行したいでしょう:' $ {names [@]} "のn; cp file1.txt "/ path/to/$ n/pictures"を実行します。完了しました。 – chepner

0

私はこのようなものだろう:

#!/bin/bash 

if 
    [[ "$1" = -i ]] 
then 
    shift 
    for arg in "[email protected]" 
    do 
    echo "$arg" 
    done 
fi 

多分それはあなたが処理する必要がある他のオプションに応じて、あなたの特定のケースでは動作しませんが、私は確かに情報が不足します。

関連する問題