Bourneシェルシングルクォート、ダブルクォート&バッククォート質問

StackOverflow https://stackoverflow.com/questions/1974002

  •  21-09-2019
  •  | 
  •  

質問

/!binに/ SH

   if [ "`echo $desc $status | awk -F"," '{print $3}' | awk -F" " '{print $1}' | sed '/^$/d'`" != "OK" ]; then
        echo "howdy dody"
   fi

echo $desc $status | awk -F"," '{print $3}' | awk -F" " '{print $1}' | sed '/^$/d'

最初のifの条件は、イムは、それが原因で不適切な引用のですが、私はそれを把握することはできません推測、実行されません。

任意の助けを事前に感謝します。

役に立ちましたか?

解決

あなたはバッシュを使用している場合は、

、私は$(...)の代わりにバッククォートをお勧めします。あなたはどのようなエラーメッセージを得るのですか?私の推測では、AWKに-F","オプションが適切に引用されていないことです。引用符をエスケープする\を挿入しようとしています。

他のヒント

あなたは他の引数の周りに持っているようにあなたはまた、-Fオプションに引数の周りの単一引用符を使用することができます:

if [ "`echo $desc $status | awk -F',' '{print $3}' | awk -F' ' '{print $1}' | sed '/^$/d'`" != "OK" ]; then

あなたが関数内でそれを包む場合、それはあなたのテストを記述する方がはるかに簡単です。

mytest()
{
  echo "$1 $2" \
  | awk -F"," -v arg3="$3" '{print arg3}' \
  | awk -F" " -v arg1="$1" '{print arg1}' \
  | sed '/^$/d'
}

この方法で、あなたはそれが正常に動作することを確認することができます。あなたはこの信頼を得たら、

if [ "$(mytest "$desc" "$status")" != "OK" ]; then
        echo "howdy doody"
fi

または

if mytest "$desc" "$status" | grep -q -v '^OK$'; then
  echo "howdy doody"
fi

一見すると、あなたは二重引用符の一部を脱出しようとする場合があります:

   if [ "`echo $desc $status | awk -F"," '{print $3}' | awk -F" " '{print $1}' | sed '/^$/d'`" != "OK" ]; then
        echo "howdy dody"
   fi

   if [ "`echo $desc $status | awk -F\",\" '{print $3}' | awk -F\" \" '{print $1}' | sed '/^$/d'`" != "OK" ]; then
        echo "howdy doody"
   fi

は、二重引用符をエスケープすることは確かに良いアイデアですが、それは$ 3、$ 1はawkので解釈されることを意図されているように見えます。彼らは代わりに、シェルによって解釈されています。おそらく、「$」sのを脱出したいです。 (それはあなたが$ 1とシェルでは$ 3ではない可能性が高いために意味のある値を持っている可能性があります。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top