Voglio che il mio script sia in grado di accettare un input facoltativo,
ad esempio, attualmente la mia sceneggiatura è
#!/bin/bash
somecommand foo
ma vorrei che dicesse:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Voglio che il mio script sia in grado di accettare un input facoltativo,
ad esempio, attualmente la mia sceneggiatura è
#!/bin/bash
somecommand foo
ma vorrei che dicesse:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Risposte:
È possibile utilizzare la sintassi del valore predefinito:
somecommand ${1:-foo}
Quanto sopra, come descritto nel Manuale di riferimento di Bash - 3.5.3 Espansione dei parametri della shell [enfasi mia]:
Se il parametro non è impostato o è nullo , viene sostituita l'espansione della parola. Altrimenti, viene sostituito il valore del parametro.
Se si desidera sostituire un valore predefinito solo se il parametro non è impostato (ma non se è nullo, ad esempio se è una stringa vuota), utilizzare invece questa sintassi:
somecommand ${1-foo}
Sempre dal Manuale di riferimento di Bash - 3.5.3 Espansione dei parametri della shell :
Se si omettono i due punti si ottiene un test solo per un parametro non impostato. Detto in altro modo, se i due punti sono inclusi, l'operatore verifica l'esistenza di entrambi i parametri e che il suo valore non è nullo; se i due punti vengono omessi, l'operatore verifica solo l'esistenza.
foo
if $1
is unsset o una stringa vuota " e ${1-foo}
, "return foo
if $1
is unsset".
È possibile impostare un valore predefinito per una variabile in questo modo:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Ecco alcuni esempi di come funziona:
$ ./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
-
L'avermi confuso (è negato?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
è lo stesso di ! -z
.
-n
e ! -z
quindi direi che non è il caso qui.
[ -n $1 ]
sarà sempre vero . Se usi bash, [[ -n $1 ]]
si comporterà come ti aspetti, altrimenti dovrai citare[ -n "$1" ]
per favore non dimenticare, se la sua variabile $ 1 .. $ n è necessario scrivere in una variabile normale per utilizzare la sostituzione
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Per argomenti multipli opzionali , per analogia con il ls
comando che può prendere uno o più file o di default elenca tutto nella directory corrente:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Non funziona correttamente per i file con spazi nel percorso, ahimè. Non ho ancora capito come farlo.
È possibile utilizzare la sostituzione variabile per sostituire un valore fisso o un comando (come date
) per un argomento. Le risposte finora si sono concentrate su valori fissi, ma questo è quello che ho usato per rendere la data un argomento facoltativo:
~$ 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