Я хочу, чтобы мой сценарий мог принимать необязательный ввод,
например, в настоящее время мой сценарий
#!/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