【问题标题】:How can I check if a variable is empty or not in tcsh Shell?如何在 tcsh Shell 中检查变量是否为空?
【发布时间】:2014-05-03 14:54:42
【问题描述】:

如果我必须检查 bash shell 中的变量是否为空,我可以使用以下脚本进行检查:

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

但我需要将它转换成 tcsh shell。

【问题讨论】:

标签: csh tcsh


【解决方案1】:

关于使用tcsh/csh 的标准警告适用(不要将其用于脚本,因为它的inherent limitations),但这里是翻译:

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 分支的条件将被评估,即使@987654332输入@ 分支;类似地,&&|| 表达式的两边似乎总是 评估 - 这至少适用于未定义变量的使用)。

【讨论】:

    【解决方案2】:

    你可以试试这个(found here):

    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===
    

    【讨论】:

    • 这个答案的第二部分是匿名用户建议的编辑,这似乎是关于屏蔽同名环境变量的变量。我不确定它是否与问题相关,但我将其留在这里以防它对某人有用。
    【解决方案3】:

    编辑:见下面的评论。

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

    【讨论】:

    • 你的条件倒退了。 $?1 的行为似乎与$?foo 的行为不同;似乎 $1 始终设置,即使没有传递相应的参数(这就是为什么如果您反转条件,您的解决方案会起作用)。 csh,相对于tcsh,不允许$?1
    • 哎呀,是的,你是对的。虽然我对 tcsh 也有同样的看法,但 $?!始终定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多