我有以下简单的 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
您的例子对我有用。
以下是另一种方法:
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
答案2
您的代码应该可以工作,但前提是它$MY_LIST
不包含任何特殊字符:
echo $MY_LIST
应该是printf %s "$MY_LIST"
或print -r -- "$MY_LIST"
。缺少引号会告诉 shell 扩展通配符\\*?[
。它还告诉 shell 用空格分割单词,尽管除了下一个问题外,这在这里无关紧要。- 在某些情况下,使用
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 ,)
。