Я хочу, чтобы мой сценарий мог принимать необязательный ввод,
например, в настоящее время мой сценарий
#!/bin/bash
somecommand foo
но я бы хотел сказать:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Я хочу, чтобы мой сценарий мог принимать необязательный ввод,
например, в настоящее время мой сценарий
#!/bin/bash
somecommand foo
но я бы хотел сказать:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Ответы:
Вы можете использовать синтаксис значения по умолчанию:
somecommand ${1:-foo}
Выше будет, как описано в Справочном руководстве Bash - 3.5.3 Расширение параметров оболочки [выделено мной]:
Если параметр не установлен или ноль , расширение слова заменяется. В противном случае значение параметра подставляется.
Если вы хотите заменить значение по умолчанию только в том случае, если параметр не установлен (но не в том случае, если он нулевой, например, если это не пустая строка), используйте вместо этого следующий синтаксис:
somecommand ${1-foo}
Снова из Справочного руководства Bash - 3.5.3 Расширение параметров оболочки :
Пропуск двоеточия приводит к проверке только для неустановленного параметра. Другими словами, если двоеточие включено, оператор проверяет наличие как параметра, так и того, что его значение не равно нулю; если двоеточие опущено, оператор проверяет только наличие.
foo
если $1
не задано или пустую строку », и ${1-foo}
«вернуть, foo
если $1
не задана».
Вы можете установить значение по умолчанию для переменной следующим образом:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Вот несколько примеров того, как это работает:
$ ./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
-
Меня смутило (это отрицается?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
так же, как ! -z
.
-n
и ! -z
поэтому я бы сказал, что это не так.
[ -n $1 ]
всегда будет истина . Если вы используете bash, [[ -n $1 ]]
будете вести себя так, как вы ожидаете, в противном случае вы должны процитировать[ -n "$1" ]
пожалуйста, не забывайте, если его переменная $ 1 .. $ n, вам нужно записать в обычную переменную, чтобы использовать подстановку
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Для необязательных множественных аргументов по аналогии с ls
командой, которая может принимать один или несколько файлов, или по умолчанию перечисляется все в текущем каталоге:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Не работает корректно для файлов с пробелами в пути, увы. Пока не разобрался, как заставить это работать.
Можно использовать подстановку переменных для замены фиксированного значения или команды (например date
) для аргумента. До сих пор ответы были сосредоточены на фиксированных значениях, но это то, что я использовал, чтобы сделать дату необязательным аргументом:
~$ 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