Bash-Skript: Wie kann die Erweiterung des Platzhalters in Variablen zur Flusssteuerung aktiviert werden?

Bash-Skript: Wie kann die Erweiterung des Platzhalters in Variablen zur Flusssteuerung aktiviert werden?

Ich habe fordie 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 forFlusssteuerung 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, $HOMEdaher sollte Ihr Skript folgendermaßen aussehen:

#!/bin/bash

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

Alternativ können Sie /home/$USERanstelle von $HOMEFolgendes 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, $HOMEwenn 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

verwandte Informationen