Bash Script: Como ativar o curinga na variável para expandir para controle de fluxo?

Bash Script: Como ativar o curinga na variável para expandir para controle de fluxo?

Pratiquei foro controle de fluxo, referenciando um script de exemplo como;

if [ $(id -u) = "0" ]; then
        dir_list="/home/*"
    else
        dir_list=$HOME
    fi
    for home_dir in $dir_list; do

O texto acima é parcialmente citado em "Flow Control - Part 3"http://linuxcommand.org/lc3_wss0130.php

Então, para verificar como o curinga de uma variável se comporta no forcontrole de fluxo, tentei as linhas abaixo;

#!/bin/bash

binlist="~/bin/*"
   
for i in $binlist; do
echo $i
done

Eu queria que o curinga se expandisse e todos os arquivos ~/bin/fossem exibidos como saídas, mas isso não aconteceu. A saída é apenas ~/bin/*.

Se eu não usar a variável e atribuir diretamente ~/bin/*na lista de for, o que espero que aconteça, todos os arquivos ~/bin/serão exibidos.

PERGUNTA =====

Como posso ativar a expansão de um curinga na variável?

Ou estou entendendo mal o que o código de exemplo do site de referência pretende?

=============

Obrigado por ler minha pergunta!

Responder1

Você pode usar a variável bash para seu diretório inicial em vez de ~.

A variável bash para o seu diretório inicial é $HOMEpara que seu script fique assim:

#!/bin/bash

binlist="$HOME/bin/*"
   
for i in $binlist; do
echo $i
done

Alternativamente, você poderia usar /home/$USERem vez $HOMEdisso:

#!/bin/bash

binlist="/home/$USER/bin/*"
   
for i in $binlist; do
echo $i
done

Você pode visualizar cada uma dessas variáveis ​​executando os seguintes comandos:

echo $HOME
echo $USER

Eles estão listados em "Variáveis ​​​​do Shell" na página de manual do bash.


Também,conforme mencionado por @ John1024, o til não será expandido $HOMEse for colocado entre aspas, então sua terceira opção seria usar o seguinte:

#!/bin/bash

binlist=~/"bin/*"
   
for i in $binlist; do
echo $i
done

econforme mencionado por @bac0nas aspas não são necessárias aqui, então você também pode usar o seguinte:

#!/bin/bash

binlist=~/bin/*
   
for i in $binlist; do
echo $i
done

informação relacionada