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