Я хочу, чтобы мой script мог взять необязательный ввод,
например. в настоящее время мой script
#!/bin/bash
somecommand foo
но я хотел бы, чтобы он сказал:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Я хочу, чтобы мой script мог взять необязательный ввод,
например. в настоящее время мой script
#!/bin/bash
somecommand foo
но я хотел бы, чтобы он сказал:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Вы можете использовать синтаксис по умолчанию:
somecommand ${1:-foo}
Вышеизложенное, как описано в Bash Справочное руководство - 3.5.3 Расширение параметров оболочки [акцент мой]:
Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.
Если вы хотите заменить значение по умолчанию, если параметр не установлен (но не если он равен null, например, если это пустая строка), используйте этот синтаксис вместо:
somecommand ${1-foo}
Снова из Bash Справочное руководство - 3.5.3 Расширение параметров оболочки:
Опускание двоеточия приводит к тестированию только для параметра, который не установлен. Иными словами, если двоеточие включено, оператор проверяет существование обоих параметров и что его значение не равно нулю; если двоеточие опущено, оператор проверяет только на существование.
Вы можете установить значение по умолчанию для переменной следующим образом:
ARG1=${1:-foo}
ARG2=${2:-bar}
echo $ARG1
echo $ARG2
Вот несколько примеров того, как это работает:
$ ./somecommand.sh
foo
bar
$ ./somecommand.sh 1
1
bar
$ ./somecommand able was i
able
was
$ ./somecommand.sh "able was i"
able was i
bar
$ ./somecommand "able was i" super
able was i
super
$ ./somecommand.sh "able was i" "super duper"
able was i
super duper
$ ./somecommand.sh "" "super duper"
foo
super duper
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
Вы можете проверить количество аргументов с помощью $#
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
пожалуйста, не забудьте, если его переменная $1.. $n вам нужно написать регулярную переменную, чтобы использовать подстановку
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
Для необязательных нескольких аргументов, по аналогии с командой ls
, которая может принимать один или несколько файлов или по умолчанию перечисляет все в текущем каталоге:
if [ $# -ge 1 ]
then
files="[email protected]"
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
Это позволяет использовать значение по умолчанию для необязательного 1-го аргумента и сохраняет несколько аргументов.
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3