为什么IFS影响子壳变量

  • 本文关键字:变量 影响 IFS ksh
  • 更新时间 :
  • 英文 :


此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" ...(

最新更新