Il mio script di bash riceve un nome file (o percorso relativo) come stringa, ma deve quindi leggere da quel file. Posso solo leggere da un nome di file se lo dichiaro come letterale direttamente nello script (senza virgolette) ... il che è impossibile per gli argomenti poiché sono implicitamente le stringhe per cominciare. Osservare:bash: interpreta la variabile di stringa come nome file/percorso
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
RENDIMENTI:
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
Come detto sopra, non riesco a passare un argomento riga di comando per le routine di cui sopra in quanto ottengo lo stesso comportamento che ho sulle stringhe tra virgolette.
"~/test.txt" e "~/test.txt" interrompono l'espansione di ~ nella tua home directory. ~/test.txt funziona perché non è quotato. Smetti di usare la notazione ~ o smetti di usare virgolette .... –
Se usi solo l'argomento della riga di comando dello script ('$ 1'), allora tutto funzionerà bene perché l'espansione della directory home sarà già stata eseguita prima che lo script venga chiamato. – rici
@rici Sì, a condizione che '~' non sia quotato quando il suo script viene chiamato dalla riga di comando o da un altro script. È una storia diversa quando il suo script viene chiamato da un altro programma che passa _a literal_ '~' Questo sarebbe un errore che dovrebbe essere corretto nell'altro programma; ma se vuole affrontare un caso del genere nella sua sceneggiatura, probabilmente ha bisogno di "valutazione". – Uwe