У меня есть скрипт bash, который выглядит примерно так:
#!/bin/bash
if [ $1 = "--test" ] || [ $1 = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Так что я хочу иметь возможность не только запускать его с помощью ./script --test
или ./script -t
, но и без аргументов (просто ./script
), но, похоже, если я сделаю это с текущим кодом, результат будет просто:
./script: line 3: [: =: unary operator expected
./script: line 3: [: =: unary operator expected
Not testing.
Так как мне запрограммировать его так, чтобы его запуск без каких-либо аргументов вообще выполнялся else
без выдачи ошибки? Что я делаю неправильно?
command-line
bash
scripts
Питер Кордес
источник
источник
Ответы:
«Правильный способ» использования длинных опций в сценариях оболочки - использование утилиты getopt GNU . Также есть getopts, встроенный в bash , но он допускает только короткие варианты, такие как
-t
. Несколько примеровgetopt
использования можно найти здесь .Вот сценарий, который демонстрирует, как я подхожу к вашему вопросу. Объяснение большинства шагов добавляется в виде комментариев в самом скрипте.
С некоторыми упрощениями и удаленными комментариями это можно сжать до:
источник
Несколько способов; два наиболее очевидных:
$1
в двойные кавычки:if [ "$1" = "--test" ]
Еще лучше, используйте getopts.
источник
[ "x$1" = "x--test" ]
снова защищать аргументы командной строки, которые являются действительными операторами для[
команды. (Это еще одна причина, почему[[ ]]
предпочтительнее: это часть синтаксиса оболочки, а не просто встроенная команда.)Вы должны заключить свои переменные в условие if. Заменить:
с:
Тогда это будет работать:
Всегда всегда ставьте в кавычки ваши переменные
источник
foo=bar echo '$foo'
распечатки$foo
с переменным расширением для вывода, но вместо этогоfoo=bar echo "$foo"
печатаетсяbar
.Вы используете Bash. Bash имеет хорошую альтернативу
[
:[[
. При этом[[
вам не нужно беспокоиться о цитировании, и вы получите гораздо больше операторов, чем[
, включая надлежащую поддержку||
:Или вы можете использовать регулярные выражения:
Конечно, правильное цитирование всегда должно быть сделано, но нет никаких оснований придерживаться
[
при использовании bash.источник
Чтобы проверить, присутствуют ли аргументы (в общем, и выполните действия соответственно), это должно сработать:
источник
[ -z "$1" ]
?$check
один раз, перед любымshift
s, так что лучше использовать$1
вместо него.#!
при предоставлении примеров (вы должны описать оболочку вне кода).