다음과 같은 간단한 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 ,)
.