Ваш код должен работать, но только если $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 ,)
.