Почему IFS влияет на переменную подоболочки? - PullRequest
0 голосов
/ 02 мая 2019

Этот код KSH отлично работает в AIX и RH со стандартным IFS (по умолчанию)

[ "$(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, например, a;например

[ "$(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

Кто-то может объяснить мне, почему это происходит и как мы можем решить это без оценки?Спасибо за ваше время: -)

1 Ответ

2 голосов
/ 02 мая 2019

У вас есть ECHO="echo -e", затем вы устанавливаете IFS=";", поэтому, когда вы расширяете $ ECHO без кавычек (где вступают в силу глобализация и разбиение слов), вы получаете echo -e как одно слово (потому что вы разделяете слова, используяточка с запятой, а не пробел), и, конечно, такой команды нет.

Возможно, вы захотите сослаться на Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу ,Ответ заключается в использовании массива:

[ "$(uname)" = "AIX" ] && ECHO=(echo) || ECHO=(echo -e)

А затем используйте его как

"${ECHO[@]}" "$a" | cut -c1-2

Вам также нужно будет использовать больше кавычек.Обратитесь к Последствия для безопасности, связанные с забыванием заключать в кавычки переменную в оболочках bash / POSIX

(todo: обсудить, не используя "echo -e" ...)

...