Eu tenho o seguinte código ksh simples:
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 -:(
talvez porque alguns espaços?
posso obter alguma outra sugestão para contar e imprimir as palavras $MY_LIST ? (depois de remover o separador ",")
Responder1
Seu exemplo funciona para mim.
Aqui está uma alternativa:
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
Responder2
Seu código deve funcionar, mas somente se $MY_LIST
não contiver nenhum dos vários caracteres especiais:
echo $MY_LIST
deveria serprintf %s "$MY_LIST"
ouprint -r -- "$MY_LIST"
. A falta de aspas diz ao shell para expandir caracteres globbing\\*?[
. Ele também diz ao shell para dividir as palavras em espaços, embora isso não importe aqui, exceto no próximo problema.- O uso
echo
adicional causa a interpretação de barras invertidas e um início-
em algumas circunstâncias. - `sed s"/,/ /g" cria vírgulas e espaços como separadores de palavras.
Um problema adicional, que explica por que seu teste final não funciona, é que ele wc -w
produz resultados com espaços iniciais, que são capturados em $NUM_IN_LIST
. print $NUM_IN_LIST
realiza a divisão de palavras em $NUM_IN_LIST
, então acaba imprimindo apenas os dígitos; fazer print "$NUM_IN_LIST"
para ver a diferença. A [[ … ]]
construção inibe a divisão de palavras e =
é um operador de comparação de strings, portanto, você foi informado corretamente de que ' 3'
não é a mesma coisa que '3'
. [[ $NUM_IN_LIST -eq 3 ]]
ou [ $NUM_IN_LIST = 3 ]
teria sido verdade (mas nenhuma delas é uma solução real, são apenas soluções alternativas limitadas).
Uma maneira ksh pura de mostrar o número de campos separados por vírgula é
commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}
Se alguém precisar de uma solução POSIX sh, substitua a primeira linha por commas=$(printf %s "$MY_LIST" | tr -dc ,)
.