1

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

2 ответа2

1

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

  • echo $MY_LIST должен быть printf %s "$MY_LIST" или print -r -- "$MY_LIST" . Отсутствие кавычек заставляет оболочку расширять глобальные символы \\*?[ . Он также указывает оболочке разбивать слова на пробелы, хотя это не имеет значения, за исключением следующей проблемы.
  • Использование 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 ,) .

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .