Bash Script: ¿Cómo habilitar el comodín en la variable para expandirse para el control de flujo?

Bash Script: ¿Cómo habilitar el comodín en la variable para expandirse para el control de flujo?

He practicado forel control de flujo, haciendo referencia a un script de muestra como;

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

Lo anterior son líneas parcialmente citadas de "Control de flujo - Parte 3"http://linuxcommand.org/lc3_wss0130.php

Luego, para comprobar cómo se comporta el comodín de una variable en el forcontrol de flujo, probé las líneas siguientes;

#!/bin/bash

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

Quería que el comodín se expandiera y que todos los archivos ~/bin/se mostraran como resultados, pero no sucedió. La salida es simplemente ~/bin/*.

Si no uso la variable y la asigno directamente ~/bin/*a la lista de for, sucede lo que espero: ~/bin/se muestran todos los archivos.

PREGUNTA=====

¿Cómo puedo habilitar la expansión de un comodín en una variable?

¿O no entiendo bien lo que pretende el código de muestra del sitio de referencia?

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

¡Gracias por leer mi pregunta!

Respuesta1

Puede utilizar la variable bash para su directorio de inicio en lugar de ~.

La variable bash para su directorio de inicio es $HOMEpor lo que su script debería verse así:

#!/bin/bash

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

Alternativamente, puedes usar /home/$USERen lugar de $HOMEasí:

#!/bin/bash

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

Puede ver cada una de estas variables ejecutando los siguientes comandos:

echo $HOME
echo $USER

Estos se enumeran en "Variables de Shell" en la página de manual de bash.


También,como lo menciona @John1024, la tilde no se expandirá $HOMEsi se coloca entre comillas, por lo que su tercera opción sería usar lo siguiente:

#!/bin/bash

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

ycomo lo menciona @ bac0nLas comillas no son necesarias aquí, por lo que también puedes usar lo siguiente:

#!/bin/bash

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

información relacionada