Quero que meu script possa receber uma entrada opcional,
por exemplo, atualmente meu script é
#!/bin/bash
somecommand foo
mas gostaria de dizer:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Quero que meu script possa receber uma entrada opcional,
por exemplo, atualmente meu script é
#!/bin/bash
somecommand foo
mas gostaria de dizer:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Respostas:
Você pode usar a sintaxe do valor padrão:
somecommand ${1:-foo}
O descrito acima, conforme descrito no Manual de Referência do Bash - 3.5.3 Expansão dos parâmetros do shell [ênfase minha]:
Se o parâmetro estiver desativado ou nulo , a expansão da palavra será substituída. Caso contrário, o valor do parâmetro é substituído.
Se você deseja substituir apenas um valor padrão se o parâmetro não estiver definido (mas não se for nulo, por exemplo, se for uma sequência vazia), use esta sintaxe:
somecommand ${1-foo}
Novamente do Manual de Referência do Bash - 3.5.3 Expansão dos parâmetros do shell :
A omissão dos dois pontos resulta em um teste apenas para um parâmetro não definido. Em outras palavras, se os dois pontos estiverem incluídos, o operador testa a existência dos dois parâmetros e se seu valor não é nulo; se os dois pontos forem omitidos, o operador testa apenas a existência.
foo
se $1
não estiver definido ou uma string vazia " e ${1-foo}
"retornar foo
se $1
não estiver definido".
Você pode definir um valor padrão para uma variável assim:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Aqui estão alguns exemplos de como isso funciona:
$ ./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
-
mim confuso (é negado?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
é o mesmo que ! -z
.
-n
e, ! -z
portanto, diria que não é o caso aqui.
[ -n $1 ]
sempre será verdade . Se você usa o bash, [[ -n $1 ]]
irá se comportar conforme o esperado, caso contrário, você deve citar[ -n "$1" ]
por favor não esqueça, se sua variável $ 1 .. $ n você precisa escrever em uma variável regular para usar a substituição
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Para vários argumentos opcionais , por analogia com o ls
comando que pode levar um ou mais arquivos ou, por padrão, lista tudo no diretório atual:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Infelizmente, não funciona corretamente para arquivos com espaços no caminho. Ainda não descobri como fazer isso funcionar.
É possível usar a substituição de variável para substituir um valor fixo ou um comando (como date
) por um argumento. As respostas até agora se concentraram em valores fixos, mas é isso que eu costumava fazer da data um argumento opcional:
~$ 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