7

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

44

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

Например, в данный момент мой скрипт выглядит так:

#!/bin/bash
somecommand foo

Но я хотел бы, чтобы он работал следующим образом:

#!/bin/bash
somecommand [ если $1 существует, то $1, иначе foo ]

Как я могу реализовать это в Bash?

5 ответ(ов)

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} для задания значения по умолчанию, которое будет применяться, если соответствующий аргумент не передан.

0

Ваш код на 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 проверяет, имеет ли строка ненулевую длину, что более читабельно. Также рекомендуется оборачивать переменные в кавычки, чтобы избежать возможных ошибок с пробелами или пустыми значениями.

0

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

Вот пример кода на Bash:

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

В этом скрипте, если число аргументов, переданных скрипту, больше или равно 1, выполняется команда, переданная как первый аргумент ($1). Если аргументов нет, вызывается функция или команда foo.

0

Если у вас есть переменные $1, $2 и так далее, не забывайте, что вам нужно записать их в обычную переменную, чтобы использовать подстановку. Например, в вашем скрипте:

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

Здесь переменная NOW получает значение аргумента $1. Если $1 не задан, то используется текущая дата в формате "ГГГГ-ММ-ДД". Таким образом, конструкция ${NOW:-$(date +"%Y-%m-%d")} позволяет задать значение по умолчанию.

0

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

Вот как это работает:

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

Когда вы запускаете скрипт без аргументов:

> mosh.sh
xyz

Скрипт выводит xyz, поскольку значение первого аргумента отсутствует, и применяется значение по умолчанию.

Когда вы запускаете скрипт с несколькими аргументами:

> mosh.sh 1 2 3
1 2 3

Скрипт выводит 1 2 3, сохраняя переданные аргументы без изменений.

Таким образом, данное решение позволяет гибко обрабатывать аргументы командной строки.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь