为什么IFS影响subshel​​l变量?

时间:2019-05-02 14:30:46

标签: ksh

此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

有人可以向我解释为什么会发生这种情况,以及如何在没有评估的情况下解决它? 谢谢您的时间:-)

1 个答案:

答案 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” ...)