Я пытаюсь выполнить простую проверку состояния, но, похоже, не работает.
Если $#
равно 0
или больше, чем 1
, тогда поздороваться.
Я пробовал следующий синтаксис без успеха:
if [ "$#" == 0 -o "$#" > 1 ] ; then
echo "hello"
fi
if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
echo "hello"
fi
Это должно работать нормально.
if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then
echo "hello"
fi
Я не уверен, что это другое в других оболочках, но если вы хотите использовать <, > , вам нужно поместить их в двойные круглые скобки следующим образом:
if (("$#" > 1))
...
Этот код работает для меня:
#!/bin/sh
argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
echo "foo"
else
echo "bar"
fi
Я не думаю, что sh поддерживает "==". Используйте "=" для сравнения строк и -eq для сравнения ints.
man test
для более подробной информации.
-gt
больше чем. Или просто замените все это на [ $# -ne 1 ]
.
Если вы используете параметр bash exit code $? как переменную, лучше сделать это:
if [ $? -eq 4 -o $? -eq 8 ] ; then
echo "..."
fi
Потому что, если вы это сделаете:
if [ $? -eq 4 ] || [ $? -eq 8 ] ; then
Левая часть OR изменяет переменную $?, поэтому правая часть OR не имеет оригинальной $?.
Иногда вам нужно использовать двойные скобки, иначе вы получите ошибку, например, слишком много аргументов
if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
then
fi
Вы пробовали что-то вроде этого:
if [ $# -eq 0 ] || [ $# -gt 1 ]
then
echo "$#"
fi
echo
даже когда у меня есть единственный аргумент.
Из Bash Справочное руководство → 3.4.2 Специальные параметры
#
($ #) Расширяется до числа позиционных параметров в десятичном формате.
Следовательно, $#
всегда будет либо 0, либо большим целым числом.
Итак, если вы хотите что-то делать, когда $#
равно 0 или больше 1, вам просто нужно проверить, есть ли $#
или нет 1
:
[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1"
В этом случае используется синтаксис:
[ condition ] && {things if true} || {things if false}
[[ -n $A ]] && echo 1 || echo 2