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


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

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

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

3 21

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 всегда определяется , даже если не задано).

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

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

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

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

set name
if ( ${%name} == 0 ) then
        echo " Variable name has 0 characters as value."
endif
Обратите внимание, что лицо, опубликовавшее это сообщение, имеет следующую подпись:

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

Примечание: если переменная окружения name-это переменная окружения, она будет прервана.

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

++++++
===foobar===

Правка: см. комментарий ниже.

if ( $?1 ) then
    echo "variable is empty"
else 
    echo "variable contains $1"
endif