2017-04-14 6 views
-1

シェルスクリプトの初心者です。私は、ファイル内の文字列の値をいくつか置き換えることを再考しました。コマンドラインから読み込む必要があり、シェルスクリプトは以下のようになります。配列に同じ名前の引数を持たせる方法

test.sh --old-value yahoo.com --new-value ibibo.io --old-value xxxxxx --new-value yyy --exclude aa bb cc 

は今、私は他の配列に1列、--new-値に--old-値を読み込み、別の配列に--excludeたいです。

私は以下のアプローチを試しています。

while [[ $# -gt 1 ]] 
    do 
    key="$1" 

    case $key in 



     --old-value) 
     OLDVALUE="$2" 
     shift # past argument 
     ;; 

     --new-value) 
     NEWVALUE="$2" 
     shift # past argument 
     ;; 

     --exclude) 
     EXCLUDEFILETYPES=("[email protected]") 
     shift 
     ;; 

     *) 
     # unknown option 
    ;; 
esac 
shift # past argument or value 
done 

しかし、これは古い値をOLDVALUEに読み込みます。 --old-valuesの両方を配列に読み込む必要があります。

このユースケースの達成方法をお手伝いできますか?

+0

2つのオプションを持つことは少し冗長です。特に、ペアで*発生する必要があるように見えるためです。任意のチャンスを2つの引数を取る単一のオプションに減らすことができますか?例えば、 'test.sh --replace yahoo.com ibibo.io --replace xxxxx yyy --exclude aa bb cc' – chepner

答えて

1
#!/bin/bash 

# declare arrays 
old=(); new=(); exclude=() 

while [[ $# -gt 1 ]]; do 
    key="$1" 
    value="$2" 
    [[ $key == --old-value ]] && old+=("$value") 
    [[ $key == --new-value ]] && new+=("$value") 
    [[ $key == --exclude ]] && shift && exclude+=("[email protected]") 
    shift 2 
done 

# show content of arrays 
declare -p old new exclude 

私は--exclude aa bb ccが最後の引数であると仮定します。


例:./test.sh --old-value yahoo.com --new-value ibibo.io --old-value xxxxxx --new-value yyy --exclude aa bb cc

出力:

 
declare -a old='([0]="yahoo.com" [1]="xxxxxx")' 
declare -a new='([0]="ibibo.io" [1]="yyy")' 
declare -a exclude='([0]="aa" [1]="bb" [2]="cc")' 
+0

あなたより。それは私のために働いた – Phani

0

他の変形:

while (($#)); do 
    case "$1" in 
    --old-value) old+=("$2") ;; 
    --new-value) new+=("$2") ;; 
    --exclude) shift; exc=("[email protected]") ; break ;; 
    --*) echo "bad arg" ; exit 1 ;; 
    esac 
    shift;shift 
done 
printf "old: %s\n" "${old[@]}" 
printf "new: %s\n" "${new[@]}" 
printf "exc: %s\n" "${exc[@]}" 

出力

old: yahoo.com 
old: xxxxxx 
new: ibibo.io 
new: yyy 
exc: aa 
exc: bb 
exc: cc 

もちろん、これにはまだ問題があります。たとえば、スクリプトが

--old-value yahoo.com --new-value --old-value xxxxxx --new-value yyy --exclude aa bb cc 

という名前の新しい値の引数として記録されているとします。そのような場合、結果は間違っています。

old: yahoo.com 
new: --old-value 
exc: 

このようなエラーケースを処理するには、はるかに複雑な状態処理が必要です。

関連する問題