【问题标题】:shell script purpose of x in "x$VARIABLE" [duplicate]“x$VARIABLE”中 x 的 shell 脚本用途 [重复]
【发布时间】:2010-12-20 19:28:09
【问题描述】:

我正在浏览一些 shell 脚本 - comarison shcu as 中的 x 的用途是什么

 if [ "x$USER" != "x$RUN_AS_USER" ]; then
        su - $RUN_AS_USER -c "$CATALINA_HOME/bin/startup.sh"
 else
        $CATALINA_HOME/bin/startup.sh
 fi

【问题讨论】:

标签: unix shell


【解决方案1】:

如果变量是空字符串或未初始化,没有 x if 在变量替换后将如下所示:

 if [ != ]; then

因此它会因为缺少操作数而失败。 使用xif 看起来像这样:

 if [ x != x]; then

在语法上是有效的。

【讨论】:

    【解决方案2】:

    如果其中一个变量为空,则可以确保在替换中不会得到空字符串。通过将x 放在两边,这与直接比较变量相同,但两边总是非空的。

    这是一个旧的组合,当脚本被编写为时更有意义:

    if [ x$USER != x$RUN_AS_USER ]
    

    如果你只有 $USER 并且它是空的,那么你最终可以得到

    if [  != root ]   # Syntax error
    

    使用x 你会得到这个,这更好:

    if [ x != xroot ]
    

    但是,当引用变量时,x 是不必要的,因为引号中的空字符串不会被完全删除。它仍然显示为令牌。因此

    if [ "$USER" != "$RUN_AS_USER" ]   # Best
    

    是最好的写法。在两个变量都为空的最坏情况下,你会得到这是一个有效的声明:

    if [ "" != "" ]
    

    【讨论】:

    • 而且'$USER'是否为'-f'也无所谓,因为要测试三个参数,所以一定是不等式而不是文件测试操作。
    【解决方案3】:

    正如 Cristian Ciupitu 所建议的那样,问题与奇数球值有关,但空字符串不是问题(至少在引用整个值时不是问题)。该问题与可能与要测试的运算符混淆的名称有关(或“[”;在某些系统上,确实有一个程序/bin/[)。 POSIX 标准几乎使这变得多余,但考虑一下如果 '$USER' 为 '-f'、'$RUN_AS_USER' 为空并且不使用 x 和引号会发生什么。

    if [ -f != ]
    then : someone has a file called '!='
    else : they don't have a file called '!='
    fi
    

    通过使用引号和前导 x,可以避免这种误解。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多