Ich habe for
die Flusssteuerung geübt und dabei ein Beispielskript wie das folgende als Referenz verwendet:
if [ $(id -u) = "0" ]; then
dir_list="/home/*"
else
dir_list=$HOME
fi
for home_dir in $dir_list; do
Das Obige ist teilweise ein Zitat aus "Flow Control - Part 3"http://linuxcommand.org/lc3_wss0130.php
Um dann zu überprüfen, wie sich das Platzhalterzeichen in einer Variablen bei der for
Flusssteuerung verhält, habe ich die folgenden Zeilen ausprobiert:
#!/bin/bash
binlist="~/bin/*"
for i in $binlist; do
echo $i
done
Ich wollte, dass das Platzhalterzeichen erweitert wird und alle Dateien ~/bin/
als Ausgabe angezeigt werden, aber das ist nicht passiert. Die Ausgabe ist nur ~/bin/*
.
Wenn ich die Variable nicht verwende und sie direkt ~/bin/*
der Liste von zuweise for
, geschieht das Erwartete: Alle Dateien in ~/bin/
werden angezeigt.
FRAGE=====
Wie kann ich die Erweiterung einer Variable durch ein Platzhalterzeichen aktivieren?
Oder verstehe ich den Beispielcode der Referenzseite falsch?
=============
Vielen Dank, dass Sie meine Frage gelesen haben!
Antwort1
Sie können stattdessen die Bash-Variable für Ihr Home-Verzeichnis verwenden ~
.
Die Bash-Variable für Ihr Home-Verzeichnis lautet, $HOME
daher sollte Ihr Skript folgendermaßen aussehen:
#!/bin/bash
binlist="$HOME/bin/*"
for i in $binlist; do
echo $i
done
Alternativ können Sie /home/$USER
anstelle von $HOME
Folgendes verwenden:
#!/bin/bash
binlist="/home/$USER/bin/*"
for i in $binlist; do
echo $i
done
Sie können jede dieser Variablen anzeigen, indem Sie die folgenden Befehle ausführen:
echo $HOME
echo $USER
Diese sind auf der Bash-Manpage unter „Shell-Variablen“ aufgeführt.
Auch,wie von @John1024 erwähnt, die Tilde wird nicht erweitert, $HOME
wenn sie in Anführungszeichen steht. Ihre dritte Option wäre daher, Folgendes zu verwenden:
#!/bin/bash
binlist=~/"bin/*"
for i in $binlist; do
echo $i
done
Undwie von @bac0n erwähntdie Anführungszeichen sind hier nicht erforderlich, Sie können daher auch Folgendes verwenden:
#!/bin/bash
binlist=~/bin/*
for i in $binlist; do
echo $i
done