Как написать bash-скрипт с необязательными аргументами ввода?
Я хочу, чтобы мой скрипт мог принимать необязательный ввод.
Например, в данный момент мой скрипт выглядит так:
#!/bin/bash
somecommand foo
Но я хотел бы, чтобы он работал следующим образом:
#!/bin/bash
somecommand [ если $1 существует, то $1, иначе foo ]
Как я могу реализовать это в Bash?
5 ответ(ов)
Вы можете установить значения по умолчанию для переменных следующим образом:
somecommand.sh
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-'bar is'}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Вот несколько примеров того, как это работает:
$ ./somecommand.sh
foo
bar is
1
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh ez
ez
bar is
1
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh able was i
able
was
i
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh "able was i"
able was i
bar is
1
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh "able was i" super
able was i
super
1
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Чт 19 мая 2022 06:58:52 ADT
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
Таким образом, вы можете использовать конструкцию ${VAR:-default}
для задания значения по умолчанию, которое будет применяться, если соответствующий аргумент не передан.
Ваш код на Bash предназначен для проверки, передан ли аргумент $1
в скрипт. Вот объяснение:
if [ ! -z $1 ]
then
: # $1 был передан
else
: # $1 не был передан
fi
Объяснение:
if [ ! -z $1 ]
: Эта строка проверяет, не является ли переменная$1
пустой.-z
возвращаетtrue
, если строка пуста, а!
инвертирует этот результат. Таким образом, условие истинно, если$1
не пусто.then ... else ... fi
: Если условие истинно (аргумент был передан), выполняется блокthen
. В противном случае выполняется блокelse
.
Вы можете улучшить код, используя более современный синтаксис:
if [ -n "$1" ]; then
: # $1 был передан
else
: # $1 не был передан
fi
Здесь -n
проверяет, имеет ли строка ненулевую длину, что более читабельно. Также рекомендуется оборачивать переменные в кавычки, чтобы избежать возможных ошибок с пробелами или пустыми значениями.
Вы можете проверить количество аргументов с помощью $#
.
Вот пример кода на Bash:
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
В этом скрипте, если число аргументов, переданных скрипту, больше или равно 1, выполняется команда, переданная как первый аргумент ($1
). Если аргументов нет, вызывается функция или команда foo
.
Если у вас есть переменные $1, $2 и так далее, не забывайте, что вам нужно записать их в обычную переменную, чтобы использовать подстановку. Например, в вашем скрипте:
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
Здесь переменная NOW
получает значение аргумента $1
. Если $1
не задан, то используется текущая дата в формате "ГГГГ-ММ-ДД". Таким образом, конструкция ${NOW:-$(date +"%Y-%m-%d")}
позволяет задать значение по умолчанию.
Этот код позволяет задать значение по умолчанию для первого необязательного аргумента и сохраняет возможность передачи нескольких аргументов.
Вот как это работает:
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
Когда вы запускаете скрипт без аргументов:
> mosh.sh
xyz
Скрипт выводит xyz
, поскольку значение первого аргумента отсутствует, и применяется значение по умолчанию.
Когда вы запускаете скрипт с несколькими аргументами:
> mosh.sh 1 2 3
1 2 3
Скрипт выводит 1 2 3
, сохраняя переданные аргументы без изменений.
Таким образом, данное решение позволяет гибко обрабатывать аргументы командной строки.
Как разобрать аргументы командной строки в Bash?
Как передать все аргументы, переданные в Bash-скрипт, в мою функцию?
Проверьте количество аргументов, переданных Bash-скрипту
Передача параметров в функцию Bash
Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?