Chcę, aby mój skrypt mógł pobierać opcjonalne dane wejściowe,
np. obecnie mój skrypt to
#!/bin/bash
somecommand foo
ale chciałbym powiedzieć:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Chcę, aby mój skrypt mógł pobierać opcjonalne dane wejściowe,
np. obecnie mój skrypt to
#!/bin/bash
somecommand foo
ale chciałbym powiedzieć:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Odpowiedzi:
Możesz użyć składni wartości domyślnej:
somecommand ${1:-foo}
Powyższe będzie, jak opisano w Bash Reference Manual - 3.5.3 Rozbudowa parametru powłoki [moje podkreślenie]:
Jeśli parametr jest nieustawiony lub zerowy , rozwinięcie słowa jest podstawiane. W przeciwnym razie wartość parametru zostanie podstawiona.
Jeśli chcesz zastąpić wartość domyślną tylko wtedy, gdy parametr jest nieustawiony (ale nie jeśli jest pusty, np. Jeśli nie jest pustym ciągiem), użyj następującej składni:
somecommand ${1-foo}
Ponownie z podręcznika użytkownika Bash - 3.5.3 Rozszerzenie parametru powłoki :
Pominięcie dwukropka powoduje tylko test parametru, który nie jest ustawiony. Innymi słowy, jeśli dwukropek jest uwzględniony, operator sprawdza istnienie obu parametrów i czy jego wartość nie jest zerowa; jeśli dwukropek zostanie pominięty, operator sprawdza tylko istnienie.
foo
if $1
is unset or a empty string ”, a ${1-foo}
„returnfoo
jeśli nie $1
jest ustawiony”.
Możesz ustawić wartość domyślną dla zmiennej takiej jak:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Oto kilka przykładów tego, jak to działa:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
Mylić mnie (to jest negowane?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
jest taki sam jak ! -z
.
-n
a ! -z
więc chciałbym powiedzieć, że nie jest w tym przypadku.
[ -n $1 ]
zawsze będzie to prawda . Jeśli użyjesz bash, [[ -n $1 ]]
zachowa się tak, jak się spodziewasz, w przeciwnym razie musisz zacytować[ -n "$1" ]
nie zapomnij, jeśli jego zmienna $ 1 .. $ n musisz zapisać do zmiennej zwykłej, aby użyć podstawienia
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
W przypadku opcjonalnych wielu argumentów, analogicznie do ls
polecenia, które może pobrać jeden lub więcej plików lub domyślnie wyświetla listę wszystkich elementów w bieżącym katalogu:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Niestety, nie działa poprawnie dla plików ze spacjami w ścieżce. Nie wymyśliłem jeszcze, jak to zrobić.
Możliwe jest użycie podstawienia zmiennej w celu podstawienia stałej wartości lub polecenia (podobnego date
) dla argumentu. Odpowiedzi do tej pory koncentrowały się na ustalonych wartościach, ale tego użyłem, aby data była opcjonalnym argumentem:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY