Mój skrypt bash otrzymuje nazwę pliku (lub względną ścieżkę) jako ciąg, ale musi następnie odczytać z tego pliku. Mogę odczytać tylko z pliku, jeśli zadeklaruję go jako literał bezpośrednio w skrypcie (bez cudzysłowów) ... co jest niemożliwe dla argumentów, ponieważ są one domyślnie ciągami. Przestrzegać:bash: interpretuj zmienną łańcuchową jako nazwę pliku/ścieżkę
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
plonów:
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
Jak wspomniano powyżej, nie mogę przekazać argument wiersza polecenia do powyższych procedur, ponieważ mam ten sam problem, że dostać się na cudzysłowami.
"~/test.txt" i "~/test.txt" zatrzymują rozszerzenie ~ w twoim katalogu domowym. ~/test.txt działa, ponieważ jest niecytowany. Przestań używać notacji ~ lub przestań używać cudzysłowów .... –
Jeśli użyjesz argumentu wiersza poleceń skryptu ('$ 1'), wszystko będzie działać poprawnie, ponieważ rozszerzenie katalogu domowego będzie już wykonane przed wywołaniem skryptu. – rici
@rici Tak, pod warunkiem, że '~' nie jest cytowane, gdy jego skrypt jest wywoływany z linii poleceń lub z innego skryptu. To inna historia, gdy jego skrypt jest wywołany z jakiegoś innego programu, który przekazuje _a literał_ '~' To byłby błąd, który powinien zostać naprawiony w innym programie; ale jeśli chce poradzić sobie z taką sytuacją w swoim własnym scenariuszu, prawdopodobnie potrzebuje 'eval'. – Uwe