Я хочу, щоб мій сценарій міг взяти необов'язковий вклад,
наприклад, зараз мій сценарій є
#!/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}
Вищенаведене буде, як описано в Довідковому посібнику Баша - Розширення параметрів оболонки 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