为什么 if 总是打印为空?试图测试传入的变量是否已设置?

why does the if always print empty? attempting to test whether passed in variable is set?

我正在尝试编写一个 csh 别名(是的,它必须是 csh,但愿它不是)。我想传入一个变量名,并根据它是否被设置或不对其进行操作。我已将代码归结为以下内容。令我困惑的是第一个 echo 打印 1 或 0 取决于是否设置了值,但是 if 中的 echo 总是打印空。

alias trythis 'eval echo $\?\!:1 ; eval if $\?\!:1 then ; echo empty ; endif ; '

假设发生的情况是,如果您传入 PATH,它不应该打印任何内容,但如果您传入 PATHx,它应该打印为空。 (是的,if 可能是倒过来的,但我去掉了 ! 让事情变得更简单)

所以 trythis PATH 应该打印为空,trythis PATHx 应该什么都不打印

刚刚发现这个有效:

 alias trythis 'eval set xxx=$\?\!:1 ; echo $xxx ; if ( $xxx == 0 ) echo empty ; '

我想有一种形式的 if 不需要 then。很高兴我不想在 if 中加入很多命令。 csh 的语法真让我困惑。

如果有人能展示如何用 if 放置多个命令,那就太好了

关于您的原始代码的误导部分是您没有为第二个 eval 语句正确转义分号,例如以下部分:

eval if $\?\!:1 then ; echo empty ; endif ;

shell 执行三个语句:

  • eval if $\?\!:1 then - 这将默默地失败/什么都不做
  • echo empty - 这将始终打印 empty
  • endif - 这什么都不做(不知道为什么 csh 不在这里抱怨)

这是一个带有转义分号的更新版本,因此您可以将前三个语句作为一个语句执行:

alias trythis 'eval echo $\?\!:1 ; eval if $\?\!:1 then \; echo empty \; endif ;'

当您说要在 if 中放置多个命令时,我不确定您的意思。您是否正在寻找一种方法来在一个 if 语句或其他语句中测试多个命令的结果?也许这是一个新的堆栈溢出问题。