A divisão de uma string em um caractere específico é incorporada ao shell em um nível muito profundo: se você escreve $var
sem nenhuma aspas ao redor, ela é expandida da seguinte forma:
- Pegue o valor da variável
var
.
- Divida esse valor em uma lista de campos. O separador de campo é qualquer caractere no valor da variável
IFS
. Se IFS
contiver caracteres de espaço em branco, os separadores consecutivos serão considerados como um; para caracteres que não são espaços em branco, os separadores consecutivos resultam em campos vazios.
- Execute globbing, ou seja, interprete cada campo resultante como um padrão curinga de nome de arquivo. Para cada padrão que corresponda a um ou mais arquivos, substitua-o pela lista de arquivos correspondentes.
O mesmo acontece com uma substituição de comando $(somecommand)
, exceto que a etapa 1 é “coletar a saída da execução de somecommand
e retirar todas as novas linhas no final”.
Para evitar toda essa ladainha e apenas obter o valor exato da variável, ou a saída do comando menos as novas linhas finais, certifique-se de colocar a substituição de variável ou substituição de comando entre aspas duplas: "$foo"
, "$(foo)"
.
Para dividir o resultado de uma substituição de comando em caracteres de vírgula, defina IFS=,
e deixe a substituição desprotegida. Você precisa fazer mais uma coisa: desligue o globbing, com set -f
(e restaure-o depois com set +f
.
all_jobs=$(…)
set -f; IFS=,
for job in $all_jobs; do
sendevent -verbose -S NYT -E JOB_OFF_HOLD -J "$job" --owner me
done
set =f; unset IFS