У меня есть следующий простой код ksh:
MY_LIST=first,second,third
NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
print $NUM_IN_LIST
3
[[ $NUM_IN_LIST = 3 ]] && print match
but I dont get the match print -:(
возможно, потому что некоторые пробелы?
я могу заставить некоторое другое предложение считать и печатать слова в $MY_LIST? (после того, как удалите"", разделитель),
Ваш пример работает на меня.
Вот альтернатива:
MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match
Ваш код должен работать, но только если $MY_LIST
не содержит ни одного из различных специальных символов:
echo $MY_LIST
должен быть printf %s "$MY_LIST"
или print -r -- "$MY_LIST"
. Отсутствие кавычек говорит оболочке экс-задыхаться globbing символы \\*?[
. Это также говорит оболочке разделять слова в пробелах, хотя это не имело бы значения здесь за исключением следующей проблемы.echo
дополнительно интерпретация причин обратных косых черт и продвижение -
при некоторых обстоятельствах.Дополнительная проблема, объясняя, почему Ваше завершающее испытание не работает, является этим wc -w
производит вывод с продвижением пробелов, которые получены в $NUM_IN_LIST
. print $NUM_IN_LIST
выполняет разделение слова на $NUM_IN_LIST
, таким образом, это заканчивает тем просто, что печатало цифры; сделать print "$NUM_IN_LIST"
видеть различие. [[ … ]]
создайте разделение слова запрещений, и =
оператор сравнения строк, таким образом, Вам правильно говорят это ' 3'
не то же самое как '3'
. [[ $NUM_IN_LIST -eq 3 ]]
или [ $NUM_IN_LIST = 3 ]
было бы верно (но ни один не действительное решение, они - просто ограниченные обходные решения).
Чистый ksh способ показать количество разделенных от запятой полей
commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}
Если кому-либо нужен POSIX sh решение, замените первую строку commas=$(printf %s "$MY_LIST" | tr -dc ,)
.