我有以下簡單的 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 ,)
.