bourne shell单引号,双引号和&反引号问题

时间:2009-12-29 10:45:58

标签: shell sh

/!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-condition不会运行,我猜这是因为报价不当,但我无法理解。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

您还可以在-F选项的参数周围使用单引号,就像其他参数一样:

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

答案 1 :(得分:1)

如果将测试包装在函数中,则编写测试要容易得多:

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

答案 2 :(得分:0)

如果你正在使用Bash,我建议使用$(...)而不是后引号。您收到了哪些错误消息?我的猜测是awk的-F","选项没有被正确引用。尝试插入\以转义引号。

答案 3 :(得分:0)

乍一看,您可能想尝试转义一些双引号:

   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

答案 4 :(得分:0)

转义双引号肯定是一个好主意,但看起来$ 3和$ 1的目的是由awk解释。它们正由shell解释。你可能想逃避'$'。 (你可能在shell中有$ 1和$ 3的有意义的值,但不太可能。)