Как написать bash script, который принимает необязательные входные аргументы?

Я хочу, чтобы мой script мог взять необязательный ввод,

например. в настоящее время мой script

#!/bin/bash
somecommand foo

но я хотел бы, чтобы он сказал:

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]

Ответ 1

Вы можете использовать синтаксис по умолчанию:

somecommand ${1:-foo}

Вышеизложенное, как описано в Bash Справочное руководство - 3.5.3 Расширение параметров оболочки [акцент мой]:

Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.

Если вы хотите заменить значение по умолчанию, если параметр не установлен (но не если он равен null, например, если это пустая строка), используйте этот синтаксис вместо:

somecommand ${1-foo}

Снова из Bash Справочное руководство - 3.5.3 Расширение параметров оболочки:

Опускание двоеточия приводит к тестированию только для параметра, который не установлен. Иными словами, если двоеточие включено, оператор проверяет существование обоих параметров и что его значение не равно нулю; если двоеточие опущено, оператор проверяет только на существование.

Ответ 2

Вы можете установить значение по умолчанию для переменной следующим образом:

somecommand.sh

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

Ответ 3

if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi

Ответ 4

Вы можете проверить количество аргументов с помощью $#

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi

Ответ 5

пожалуйста, не забудьте, если его переменная $1.. $n вам нужно написать регулярную переменную, чтобы использовать подстановку

#!/bin/bash
NOW=$1
echo  ${NOW:-$(date +"%Y-%m-%d")}

Ответ 6

Для необязательных нескольких аргументов, по аналогии с командой ls, которая может принимать один или несколько файлов или по умолчанию перечисляет все в текущем каталоге:

if [ $# -ge 1 ]
then
    files="[email protected]"
else
    files=*
fi
for f in $files
do
    echo "found $f"
done

Не работает корректно для файлов с пробелами в пути, увы. Пока не выяснили, как сделать эту работу.

Ответ 7

Можно использовать подстановку переменных для замены фиксированного значения или команды (например, 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

Ответ 8

Это позволяет использовать значение по умолчанию для необязательного 1-го аргумента и сохраняет несколько аргументов.

 > cat mosh.sh
   set -- ${1:-xyz} ${@:2:$#} ; echo $*    
 > mosh.sh
   xyz
 > mosh.sh  1 2 3
   1 2 3