次のような簡単な 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"
。引用符がないと、シェルはグロブ文字を展開します\\*?[
。また、シェルはスペースで単語を分割しますが、次の問題を除いて、ここでは問題になりません。- 追加で使用した場合、状況によっては
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 ,)
。