Supondo que os valores não tenham novas linhas, então:
Seu código com alterações mínimas para que ele funcione:
O shebang deve ser #!/bin/bash
(ksh ou zsh), pois você está usando <<<
.
i=1
while [ "$i" -le 4 ]
do
A=$(awk -v var="$i" -F_ '{print $var}' <<< 'one_two_test_three')
echo "$A"
i=$((i+1))
done
No entanto, como a string vem do shell, isso poderia ser simplificado para:
IFS=_ read v1 v2 v3 v4 <<<'one_two_test_three'
printf '%s\n' "$v1" "$v2" "$v3" "$v4"
E usando uma matriz de valores (número variável de valores):
#!/bin/bash
IFS=_ read -a v <<<'one_two_test_three'
printf '%s\n' "${v[@]}"
Se for necessário que um shell mais simples seja usado:
#!/bin/sh
IFS=_ read v1 v2 v3 v4 <<-_expandvar_
one_two_test_three
_expandvar_
printf '%s\n' "$v1" "$v2" "$v3" "$v4"
Naturalmente, se não houver necessidade de definir uma variável, nem é um problema definir o valor do IFS em um script:
#/bin/sh
a='one_two_test_three'
IFS=_
set -f
printf '%s\n' $a
Observe que a variável está sendo usada sem cotação, o que pode ser inseguro.