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
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 outra sugestão para contar e imprimir as palavras em $ MY_LIST? (depois de remover o "," separador)
Seu código deve funcionar, mas somente se $MY_LIST
não contiver nenhum dos vários caracteres especiais:
echo $MY_LIST
deve ser printf %s "$MY_LIST"
ou print -r -- "$MY_LIST"
. A falta de aspas informa ao shell para expor os caracteres globbing \*?[
. Ele também diz ao shell para dividir as palavras nos espaços, embora isso não importasse aqui, exceto pelo próximo problema. echo
também causa a interpretação de barras invertidas e um% principal-
em algumas circunstâncias. Um problema adicional, explicando por que seu teste final não funciona, é que wc -w
produz saída com espaços à esquerda, que são capturados em $NUM_IN_LIST
. print $NUM_IN_LIST
realiza a divisão de palavras em $NUM_IN_LIST
, por isso acaba imprimindo apenas os dígitos; do 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 cadeias, portanto, você está corretamente informado 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 limitadas).
Uma maneira 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 ,)
.
Tags ksh