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

时间:2015-06-04 05:34:05

标签: csh

我试图写一个csh别名(是的,它必须是csh,上帝,我希望它没有#)。我想传入一个变量名称,具体取决于它是否已设置。我将代码简化为以下内容。令我困惑的是第一个echo打印1或0取决于是否设置了值,但if中的echo始终打印为空。

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

假设发生的事情是,如果你传入PATH它不应该打印任何东西,但是如果你传入PATHx它应该打印为空。 (是的,if可能是倒退了,但我撕掉了!以使事情变得更简单)

所以试试这个PATH应该打印为空,并且尝试这个PATHx应该什么都不打印

2 个答案:

答案 0 :(得分:1)

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

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

这里有三个要由shell执行的语句:

  • eval if \$\?\!:1 then - 这将无声地失败/无所事事
  • echo empty - 这将始终打印
  • endif - 这不会做任何事情(不确定为什么csh不会在这里抱怨)

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

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

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

答案 1 :(得分:0)

刚发现这个有效:

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

我想有一种形式的if if不需要当时。很高兴我不想在if中使用很多命令。 csh真的让我感到困惑。

如果有人可以展示如何使用if放置多个命令,那就太棒了