此KSH代码在具有标准IFS(默认)的AIX和RH上可以正常工作
[ "$(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
如果我设置了不同的IFS,例如;例如
+ 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
我收到类似仅在RH而不是Aix上的错误
oColl
有人可以向我解释为什么会发生这种情况,以及如何在没有评估的情况下解决它? 谢谢您的时间:-)
答案 0 :(得分:2)
您有ECHO="echo -e"
,然后设置了IFS=";"
,因此当您将$ ECHO扩展为不加引号时(其中,通行符和单词拆分将生效),您将echo -e
作为单个单词(因为您是使用分号而不是空格进行字分割),所以当然没有这样的命令。
您将要参考I'm trying to put a command in a variable, but the complex cases always fail。答案是使用数组:
[ "$(uname)" = "AIX" ] && ECHO=(echo) || ECHO=(echo -e)
然后,像
一样使用它"${ECHO[@]}" "$a" | cut -c1-2
您还需要更多使用引号。请参阅Security implications of forgetting to quote a variable in bash/POSIX shells
(待办事项:讨论不使用“ echo -e” ...)