Script Bash: come abilitare l'espansione del carattere jolly nella variabile per il controllo del flusso?

Aug 23 2020

Ho praticato foril controllo del flusso, facendo riferimento a uno script di esempio come;

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

Quanto sopra è in parte citato da righe di "Controllo di flusso - Parte 3" http://linuxcommand.org/lc3_wss0130.php

Quindi, per verificare come si comporta il carattere jolly in una variabile nel forcontrollo di flusso, ho provato le righe seguenti;

#!/bin/bash

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

Volevo che il carattere jolly si espandesse e tutti i file in ~/bin/essere visualizzati come output, ma non è successo. L'output è giusto ~/bin/*.

Se non uso la variabile e assegno direttamente ~/bin/*nell'elenco di forciò che mi aspetto, accada, ~/bin/vengono visualizzati tutti i file in .

DOMANDA =====

Come posso abilitare l'espansione di un carattere jolly in una variabile?

O sto fraintendendo cosa intende il codice di esempio del sito di riferimento?

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

Grazie per aver letto la mia domanda!

Risposte

1 mchid Aug 23 2020 at 21:15

Puoi usare la variabile bash per la tua home directory invece di ~.

La variabile bash per la tua home directory è $HOMEquindi il tuo script dovrebbe assomigliare a questo:

#!/bin/bash

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

In alternativa, potresti usare /home/$USERinvece di $HOMEcosì:

#!/bin/bash

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

È possibile visualizzare ciascuna di queste variabili eseguendo i seguenti comandi:

echo $HOME
echo $USER

Questi sono elencati in "Variabili di shell" nella manpage di bash.


Inoltre, come menzionato da @ John1024 , la tilde non si espanderà $HOMEse viene inserita tra virgolette, quindi la terza opzione sarebbe quella di utilizzare quanto segue:

#!/bin/bash

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

e come menzionato da @ bac0n le virgolette non sono necessarie qui, quindi puoi anche usare quanto segue:

#!/bin/bash

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