【问题标题】:why does the if always print empty? attempting to test whether passed in variable is set?为什么 if 总是打印为空?试图测试是否设置了传入的变量?
【发布时间】:2015-06-04 05:34:04
【问题描述】:

我正在尝试编写一个 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 应该不打印任何内容

【问题讨论】:

  • 试过这个:别名 trythis 'eval set xxx=\$\?\!:1 ;回声 $xxx ;如果 ( $xxx ) 那么 ;回声空;万一 ; ' 但现在它抱怨 $xxx 为 0 时的 if

标签: csh


【解决方案1】:

关于您的原始代码的误导部分是您没有正确地为您的第二个 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 语句或其他东西中测试多个命令的结果?也许这是一个新的堆栈溢出问题。

【讨论】:

  • 别的东西。我想做 'if ($x) then ; cmd1; cmd2; cmd3;结束
  • 并且需要转义分号以通过 eval 保留它们?没想到。谢谢。
  • 啊。您刚刚输入的内容将在该评论中起作用,因为您有一个格式正确的 if/endif 块。在您的原始代码中,您没有这样做是因为您的 eval 语句格式不正确。
  • 为了进一步说明,您不需要在 if($x) ; then cmd1; cmd2; cmd3; endif. 的示例中转义分号但是,当您通过 eval 语句传递所有内容时,您会这样做,因为您需要传递整个内容作为 eval 的字符串。希望这会有所帮助。
【解决方案2】:

刚刚发现这个可行:

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

我猜有一种 if 不需要 then 的形式。很高兴我没有尝试在 if 中放置许多命令。 csh 的语法让我很困惑。

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

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 2015-03-14
    • 2014-04-11
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多