как проверить, установлены ли оба параметра в bash?

Скажем, у меня есть исполняемый файл bash script.sh .

Я хочу использовать его как

 ./script.sh p1 p2 

p1 и p2 – два необходимых параметра для этой команды. Если один из них отсутствует, команда должна завершиться неудачей.

Поэтому мне нужно проверить их, прежде чем продолжить выполнение в script.sh . Как я могу проверить, оба они установлены?

обновлено:

Я попробовал это:

 # this is a comment line if [ -n "$1" ] || [ -n "$2" ]; then then echo 'haha' fi 

но получил:

 ./_scp.sh: line 3: syntax error near unexpected token `then' ./_scp.sh: line 3: ` then echo 'haha'' 

В оболочке POSIX, если вы хотите только проверить два параметра, установите:

 if [ "$#" -lt 2 ]; then echo 'Need 2 parameter' exit 1 fi 

Если вы хотите, чтобы два параметра не были пустыми:

 if [ -z "$1" ] || [ -z "$2" ]; then echo 'Need 2 parameter are not empty' exit 1 fi 

С bashksh ) вы можете использовать:

 [ -v var ] && echo var was set 

чтобы проверить, была ли установлена ​​переменная var или нет.

 $ [ -v var ] && echo var was set $ var= $ [ -v var ] && echo var was set var was set 

Вы можете заставить их сбой сценария:

 #!/bin/bash : "${2:?} ${1:?}" #If either one of the above is unset or null the #script will have already exited with a meaningful #diagnstic message written to standard error. 

Оболочка выходит с ошибкой, и сообщение генерируется автоматически: именно то, что он говорит, зависит от оболочки, но обычно выглядит так:

 (set --; ${1:?}) sh: 2: 1: parameter not set or null 

… где first_colon_delimited_field: $0 , следующий – $LINENO ; а затем var_name и, наконец, диагностическое сообщение. Вероятно, вы видели подобные сообщения в прошлом.

Вы можете уточнить диагностическое сообщение:

 (set --; ${1:?Hi there!}) sh: 3: 1: Hi there! 

Кроме того, это встроенный, неявный тест. Если целевые параметры установлены и не являются нулевыми (или, возможно, нулевыми, если вы отбрасываете : двоеточие из:? Синтаксиса расширения параметров) , они обычно расширяются:

 (set param; echo "${1:?This better not be empty!}") param 

И это, как и другие формы модификации расширений параметров , может применяться к другим типам параметров, а не только к вашим позициям:

 param= bash -c ' printf "Sure hope this works...\n" "${param:?Not a chance!}" echo ... but what about me\? ' newzero echo "RETURN: $?" 

… который печатает на моем терминале …

 newzero: line 1: param: Not a chance! RETURN: 127 

Необязательное диагностическое сообщение само по себе является расширением – все, что он расширяет, – это то, что оболочка будет выписывать в stderr. Я почти всегда использую его для сообщения --help когда добавляю синтаксический разбор сценария. Я просто выполняю небольшую функцию и передаю ей нумерованный параметр, который я ожидал, когда столкнулся с проблемой:

 #script and more script help(){ eval "\${$param:?\$(cat)}"; } <<HELP Usage [ and the usual ... ] HELP while getopts .... do case $opt in ($myopts) :;; (*) param=$OPTIND help;;esac done