此ksh代码在AIX和RH上正常使用标准IF(默认(
[ "$(uname)" = "AIX" ] && ECHO="echo" || ECHO="echo -e"
echo "AA BB CC DD" | while read a b c d; do
[ "`$ECHO $a | cut -c1-2`" = "AA" ] && echo $b
done
如果我设置了一个不同的ifs;例如
[ "$(uname)" = "AIX" ] && ECHO="echo" || ECHO="echo -e"
IFS=";"
echo "AA;BB;CC;DD" | while read a b c d; do
[ "`$ECHO $a | cut -c1-2`" = "AA" ] && echo $b
done
我仅在RH AIX
上才有错误+ echo 'AA;BB;CC;DD'
+ read a b c d
+ cut -c1-2
+ 'echo -e' AA
-ksh: line 3: echo -e: not found
+ [ '' '=' AA ]
+ read a b c d
+ echo .....
+ cut -d. -f1
有人可以向我解释为什么会发生这种情况,以及我们如何在没有评估的情况下解决它?感谢您的时间: - (
您有 ECHO="echo -e"
,然后设置 IFS=";"
,因此,当您毫不引用$ echo(在globbing和word spraptiting将生效(时,您将echo -e
作为单个单词(因为您是Word word word(使用半龙而不是空格分裂(,当然没有这样的命令。
您将要参考我试图将命令放在变量中,但是复杂的情况总是失败。答案是使用数组:
[ "$(uname)" = "AIX" ] && ECHO=(echo) || ECHO=(echo -e)
然后使用它像
"${ECHO[@]}" "$a" | cut -c1-2
您还需要更多地使用引号。请参阅忘记引用bash/posix shell中的变量的安全含义
(todo:讨论不要使用" echo -e" ...(