2017-06-21 6 views
2

完全なパス名を含む変数があります。私はパス内の単語の最後の出現箇所を条件付きで置き換えようとしています。スクリプトの例は、私がしようとしています何を表示する

#!/bin/sh 

testvar="/home/downloads/user/downloads" 

if [ "$1" = "alternate" ]; then 
    newtestvar=$(echo $testvar | sed -e 's/\(.*\)downloads$/\1alternate_downloads/g') 
else 
    newtestvar=$(echo $testvar | sed -e 's/\(.*\)downloads$/\1new_downloads/g') 
fi 

echo "testvar:" $testvar 
echo "newtestvar:" $newtestvar 

ラン#1

$ ./foofile 
testvar: /home/downloads/user/downloads 
newtestvar: /home/downloads/user/new_downloads 

ラン#2

$ ./foofile alternate 
testvar: /home/downloads/user/downloads 
newtestvar: /home/downloads/user/alternate_downloads 

私が意図した結果を得るかが、私は探していますif/elseを避けて、むしろsedの文脈で$ 1をチェックすることで結果を達成する方法です。

編集-1

私は速記を以下にif/elseブロックを置き換えます。それは本当に不器用で読みにくいようです。

newtestvar=$([[ $1 = "alternate" ]] && echo $testvar | sed -e 's/\(.*\)downloads$/\1alternate_downloads/g' || echo $testvar | sed -e 's/\(.*\)downloads$/\1new_downloads/g') 
+0

代わりsed' 'で、' $(dirnameは "$のtestvar")を使用 "/ alternate_downloads" 'と' $(dirnameは "$のtestvar") "/ new_downloads" '...明快にするためにif-elseを使うのに間違いはありません – Sundeep

+0

'#!/ bin/sh 'を使用したときに 'bash'と質問された理由 – anubhava

答えて

1

これはおそらく、SEDで行うことはできません。今のようにそれを呼び出す

#!/bin/bash 

testvar="/home/downloads/user/downloads" 

# default s to "new" 
s="${1:-new}" 

# replace only last value of downloads 
newtestvar="${testvar/%downloads/${s}_downloads}" 

# examine both variables 
declare -p testvar newtestvar 

を変数の値をテストし、条件付きで実行を分岐させる方法です。しかし、それはAWKで行うことができます

#!/bin/sh 

testvar="/home/downloads/user/downloads" 

newtestvar=$(awk -v arg="$1" '{ 
    replacement = arg == "alternate" ? "alternate_downloads" : "new_downloads"; 
    sub("downloads$", replacement); 
    print $0; 
    } 
' <<<"$testvar") 

echo "testvar:" $testvar 
echo "newtestvar:" $newtestvar 
+0

' alt'マッチ** awk'プログラムブロックの 'replacement = alternate ==" alternate "で次のことをしない限り? "alternate_downloads": "new_downloads"; ** – sob

+1

はい、これは仕様によるものです。空の文字列を除いて私の解* any *引数では、 'alternate_downloads'が返され、空文字列のみが' new_downloads'になります。 * new_downloadsに正しい文字列 "alternate"が 'alternate_downloads'、* any *他の引数(空の文字列も含む)がある場合は、あなたの解決策は正しいです。 – weibeld

+0

提案された動作を反映するように私の答えを更新しました。 – weibeld

2

あなたはsedを避けることができるとのbash自体にこれを処理しない:sedのは、何を持っているので、

./foofile 
declare -- testvar="/home/downloads/user/downloads" 
declare -- newtestvar="/home/downloads/user/new_downloads" 

./foofile alternate 
declare -- testvar="/home/downloads/user/downloads" 
declare -- newtestvar="/home/downloads/user/alternate_downloads" 
関連する問題