слова количества в СПИСКЕ без разделителей

У меня есть следующий простой код 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? (после того, как удалите"", разделитель),

1
задан 05.10.2010, 12:59

2 ответа

Ваш пример работает на меня.

Вот альтернатива:

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
0
ответ дан 17.12.2019, 00:32

Ваш код должен работать, но только если $MY_LIST не содержит ни одного из различных специальных символов:

  • echo $MY_LIST должен быть printf %s "$MY_LIST" или print -r -- "$MY_LIST". Отсутствие кавычек говорит оболочке экс-задыхаться globbing символы \\*?[. Это также говорит оболочке разделять слова в пробелах, хотя это не имело бы значения здесь за исключением следующей проблемы.
  • Используя echo дополнительно интерпретация причин обратных косых черт и продвижение - при некоторых обстоятельствах.
  • 'sed s"/,//g" делает и запятые и располагает разделителей слов с интервалами.

Дополнительная проблема, объясняя, почему Ваше завершающее испытание не работает, является этим 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 ,).

1
ответ дан 17.12.2019, 00:32

Теги

Похожие вопросы