Script Bash: come abilitare l'espansione del carattere jolly nella variabile per il controllo del flusso?
Ho praticato for
il 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 for
controllo 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 for
ciò 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
Puoi usare la variabile bash per la tua home directory invece di ~
.
La variabile bash per la tua home directory è $HOME
quindi 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/$USER
invece di $HOME
così:
#!/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à $HOME
se 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