Делайте то, что вы всегда (должны) делать:
- отдельные проблемы,
- избегать глобальных символов,
- документировать свой код,
- be
- может быть POSIXy.
(Да, я добавил в суп немного больше "полезных" ингредиентов, чем это абсолютно необходимо;))
ИтакМоя любимая «реакция коленного толчка» на проблемы с невидимым подоболочком состоит в том, чтобы использовать функцию:
#!/bin/sh
longest() {
#
# Print length and body of the longest line in STDIN
#
local cur_ln # current line
local cur_sz # current size (line length)
local max_sz # greatest size so far
local winner # longest string so far
max_sz=0
while read -r cur_ln
do
cur_sz=${#cur_ln}
if test "$cur_sz" -gt "$max_sz";
then
max_sz=$cur_sz
winner=$cur_ln
fi
done
echo "$max_sz" : "$winner"
}
find /usr/share/zoneinfo | longest
# ok, if you really wish to use globals, here you go ;)
LONGEST_CNT=0
LONGEST_CNT=$(
find /usr/share/zoneinfo \
| longest \
| cut -d: -f1 \
| xargs echo\
)
echo "LONGEST_CNT='$LONGEST_CNT'"
Помимо избежания раздражения подоболочки, это дает вам идеальное место для документирования кода и добавляет пространство имен.: обратите внимание, что внутри функции вы можете использовать гораздо более короткие и простые имена переменных без потери читабельности.