Mein Bash-Skript erhält einen Dateinamen (oder relativen Pfad) als String, muss aber dann aus dieser Datei lesen. Ich kann nur von einem Dateinamen lesen, wenn ich es direkt im Skript (ohne Anführungszeichen) als Literal deklariere ... was für Argumente unmöglich ist, da sie implizit mit Strings beginnen. Beachten Sie:Bash: Interpretiere String-Variable als Dateiname/Pfad
a="~/test.txt"
#Look for it
if [[ -a $a ]] ; then
echo "A Found it"
else
echo "A Error"
fi
#Try to use it
while read line; do
echo $line
done < $a
b='~/test.txt'
#Look for it
if [[ -a $b ]] ; then
echo "B Found it"
else
echo "B Error"
fi
#Try to use it
while read line; do
echo $line
done < $b
c=~/test.txt
#Look for it
if [[ -a $c ]] ; then
echo "C Found it"
else
echo "C Error"
fi
#Try to use it
while read line; do
echo $line
done < $c
RENDITEN:
A Error
./test.sh: line 10: ~/test.txt: No such file or directory
B Error
./test: line 12: ~/test.txt: No such file or directory
C Found it
Hello
Wie oben erwähnt, ich keine Befehlszeilenargument zu den Routinen oben, da ich das gleiche Verhalten, das ich auf den Strings in Anführungszeichen bekommen passieren kann.
"~/test.txt" und "~/test.txt" stoppen die Erweiterung von ~ in Ihr Home-Verzeichnis. ~/test.txt funktioniert, weil es nicht in Anführungszeichen steht. Stoppen Sie die Verwendung der ~-Notation oder stoppen Sie die Verwendung von Anführungszeichen .... –
Wenn Sie nur das Befehlszeilenargument ('$ 1') des Skripts verwenden, wird alles funktionieren, da die Home-Verzeichniserweiterung bereits ausgeführt wurde, bevor das Skript aufgerufen wird. – rici
@rici Ja, vorausgesetzt, dass '' 'nicht zitiert wird, wenn sein Skript von der Befehlszeile oder von einem anderen Skript aufgerufen wird. Es ist eine andere Geschichte, wenn sein Skript von einem anderen Programm aufgerufen wird, das _a literal_ '~' übergibt. Das wäre ein Fehler, der in dem anderen Programm behoben werden sollte; Aber wenn er sich in seinem eigenen Drehbuch mit einem solchen Fall befassen will, braucht er wahrscheinlich 'eval'. – Uwe