Как я могу проверить, является ли переменная пустой или нет в оболочке tcsh?

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

if [ -z "$1" ] 
then
    echo "variable is empty"
else 
    echo "variable contains $1"
fi

Но мне нужно преобразовать его в оболочку tcsh.


person ramkrishna    schedule 25.03.2014    source источник
comment
comment
Tcsh не подходит для программирования, но попробуйте это: if ("x$1" == "x").   -  person n. 1.8e9-where's-my-share m.    schedule 25.03.2014
comment
Это не ответ на поставленный вопрос. Вопрос был в ТСШ.   -  person Doug Royer    schedule 07.04.2020


Ответы (3)


Применяются стандартные предупреждения относительно использования tcsh/csh (не используйте его для сценариев из-за его внутренние ограничения), но вот перевод:

if ( "$1" == "" ) then      # parentheses not strictly needed in this simple case
    echo "variable is empty"
else 
    echo "variable contains $1"
endif

Однако обратите внимание, что если бы вы использовали произвольное имя переменной, а не $1 в приведенном выше примере, оператор сломался бы, если бы эта переменная еще не была определена (тогда как $1 всегда определено< /strong>, даже если он не установлен).


Чтобы спланировать случай, когда переменная, скажем, $var, может быть не определена, нужно сделать следующее:

if (! $?var) then       
  echo "variable is undefined"
else
  if ("$var" == "")  then
      echo "variable is empty"
  else 
      echo "variable contains $var"
  endif
endif

Вложенные if необходимы, чтобы избежать нарушения сценария, поскольку tcsh, по-видимому, не вызывает короткого замыкания (условие ветки else if будет оцениваться, даже если будет введена ветка if; аналогичным образом обе стороны && и || выражения, по-видимому, всегда оцениваются — это относится, по крайней мере, к использованию неопределенных переменных).

person mklement0    schedule 25.03.2014

Вы можете попробовать это (найдено здесь):

set name
if ( ${%name} == 0 ) then
        echo " Variable name has 0 characters as value."
endif

Обратите внимание, что у человека, разместившего это, есть следующая подпись:

Стандартный совет: избегайте семейства csh для сценариев.

Примечание. Это сломается, если имя является переменной среды.

setenv name foobar ; set name ; echo '+++'$name'+++' ; unset name ; echo '==='$name'==='

++++++
===foobar===
person Tom Fenech    schedule 25.03.2014
comment
Вторая часть этого ответа была редактированием, предложенным анонимным пользователем, которое, по-видимому, касается переменных, маскирующих переменные среды с тем же именем. Я не совсем уверен, что это имеет отношение к вопросу, но я оставляю его здесь на случай, если он кому-то будет полезен. - person Tom Fenech; 21.06.2018

РЕДАКТИРОВАТЬ: см. комментарий ниже.

if ( $?1 ) then
    echo "variable is empty"
else 
    echo "variable contains $1"
endif
person DrGC    schedule 19.01.2017
comment
У вас есть условие наоборот. Поведение $?1 кажется отличным от поведения $?foo; похоже, что $1 всегда устанавливается, даже если соответствующий аргумент не был передан (поэтому ваше решение работает, если вы отмените условие). csh, в отличие от tcsh, не разрешает $?1. - person Keith Thompson; 20.01.2017
comment
упс, да, ты прав. Хотя я получаю то же самое и для tcsh, $?! всегда определяется. - person DrGC; 20.01.2017