Mam problem z bardzo prostym skryptem bash (test.sh):
if [ $# >=1 ]
then
backup_file=$1
else
backup_file=~/standard.tar.bz2
fi
echo $backup_file
Jeśli podam argument:
test.sh myfile
Otrzymuję oczekiwany wynik: myfile
W przeciwnym razie nie otrzymuję żadnych danych wyjściowych. Spodziewam się zobaczyć (gdy test.sh zostanie wykonany bez argumentów): ~/standard.tar.bz2
Co ja robię źle?
Odpowiedzi:
4 dla odpowiedzi № 1Ta ocena stanu jest problemem:
[ $# >=1 ]
Zmień to na:
[ $# -ge 1 ]
LUB w BASH:
[[ $# -ge 1 ]]
LUB:
(( $# ))
[...]
i[[...]]
nie pozwól>=
jako operator- Potrzebujesz miejsca po operatorach.
3 dla odpowiedzi № 2
Jeśli używasz operatorów matematycznych, używaj ich w odpowiednim kontekście. Zamiast mówić:
if [ $# >=1 ]
mówić
if (( $# >=1 ))
(I nie musisz się martwić o przestrzenie wokół operatorów lub ich brak).
3 dla odpowiedzi nr 3
Inni zajęli się bezpośrednim problemem składniowym, ale zupełnie innym sposobem napisania tego byłoby skorzystanie rozszerzenie parametru, aby użyć wartości domyślnej:
backup_file="${1:-$HOME/standard.tar.bz2}"
Spowoduje to zastąpienie pliku backup_file wartością w $1
jeśli i tylko wtedy, gdy istnieje.