Ich möchte, dass mein Skript eine optionale Eingabe annehmen kann.
zB derzeit ist mein Skript
#!/bin/bash
somecommand foo
aber ich möchte es sagen:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Ich möchte, dass mein Skript eine optionale Eingabe annehmen kann.
zB derzeit ist mein Skript
#!/bin/bash
somecommand foo
aber ich möchte es sagen:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Antworten:
Sie können die Standardwertsyntax verwenden:
somecommand ${1:-foo}
Das Obige wird, wie im Bash-Referenzhandbuch - 3.5.3 Erweiterung der Shell-Parameter [Hervorhebung von mir] beschrieben:
Wenn der Parameter nicht gesetzt oder null ist , wird die Erweiterung des Wortes ersetzt. Andernfalls wird der Wert des Parameters ersetzt.
Wenn Sie einen Standardwert nur ersetzen möchten, wenn der Parameter nicht festgelegt ist (aber nicht, wenn er null ist, z. B. nicht, wenn es sich um eine leere Zeichenfolge handelt), verwenden Sie stattdessen diese Syntax:
somecommand ${1-foo}
Wieder aus dem Bash-Referenzhandbuch - 3.5.3 Erweiterung der Shell-Parameter :
Das Weglassen des Doppelpunkts führt zu einem Test nur für einen Parameter, der nicht festgelegt ist. Anders ausgedrückt, wenn der Doppelpunkt enthalten ist, prüft der Operator, ob beide Parameter vorhanden sind und ob ihr Wert nicht null ist. Wenn der Doppelpunkt weggelassen wird, prüft der Bediener nur die Existenz.
foo
if $1
is aset oder eine leere Zeichenfolge " und ${1-foo}
"return foo
if $1
is aset".
Sie können einen Standardwert für eine Variable wie folgt festlegen:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Hier einige Beispiele, wie dies funktioniert:
$ ./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
-
mich verwirrt (ist es negiert?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
ist das gleiche wie ! -z
.
-n
und ! -z
daher würde ich sagen, dass dies hier nicht der Fall ist.
[ -n $1 ]
ist dies immer der Fall . Wenn Sie bash verwenden, [[ -n $1 ]]
wird sich so verhalten, wie Sie es erwarten, andernfalls müssen Sie zitieren[ -n "$1" ]
Bitte vergessen Sie nicht, wenn die Variable $ 1 .. $ n ist, müssen Sie in eine reguläre Variable schreiben, um die Substitution zu verwenden
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Für optionale Mehrfachargumente , analog zum ls
Befehl, der eine oder mehrere Dateien aufnehmen kann, oder standardmäßig alles im aktuellen Verzeichnis auflistet:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Funktioniert leider nicht richtig für Dateien mit Leerzeichen im Pfad. Habe noch nicht herausgefunden, wie das funktioniert.
Es ist möglich, die Variablensubstitution zu verwenden, date
um ein Argument durch einen festen Wert oder einen Befehl (wie ) zu ersetzen . Die Antworten haben sich bisher auf feste Werte konzentriert, aber dies ist, was ich verwendet habe, um Datum zu einem optionalen Argument zu machen:
~$ 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