【问题标题】:What's wrong with this shell script syntax?这个 shell 脚本语法有什么问题?
【发布时间】:2012-05-31 05:32:25
【问题描述】:

我正在尝试运行 Apache 启动脚本 /etc/init.d/httpd。像这样的环境变量定义会报错:

CONF_FILE=$(APACHE_HOME)/conf/httpd.conf  

上面写着"/etc/init.d/httpd: line 15: APACHE_HOME: command not found"

所以,我用大括号替换了括号,脚本运行良好。是什么赋予了?我真的只是问这个问题,因为我想了解为什么它是错误的,而不是如何解决它。 shebang 就在那里,而且它没有对原始的 shell 脚本进行修改,那它为什么会误解呢?

【问题讨论】:

  • 为什么要用括号?离开他们
  • $(foo) 尝试将foo 作为命令运行,并替换该命令的输出。 APACHE_HOME 不是命令。
  • $() 是命令插值,${} 是变量替换
  • 为什么 Apache 的 httpd 文件出错了?
  • $(VAR) 是 Makefile 中的变量扩展。也许您正在查看的文件旨在由 shell 以外的东西解析。

标签: linux apache shell syntax


【解决方案1】:

$(something) 告诉 shell 执行命令 something 并替换命令的输出。1

你想替换一个变量的输出,所以你只需要在变量前面加上一个$,就像这样:CONF_FILE=$APACHE_HOME/conf/httpd.conf

或者,您可以使用CONF_FILE=${APACHE_HOME}/conf/httpd.conf(注意花括号而不是括号),但对于您的情况来说,这并不是必需的。


1当您想将 命令的 输出分配给变量时,这很有用。例如:

MY_VAR="$(egrep 'someline' somefile.txt)"

【讨论】:

  • 在这样的赋值中,变量周围不需要引号。
【解决方案2】:

在 unix 系统中:

$SOMETHING /* variable */
$(SOMETHINGELSE) /* command */
${FOO} */ variable substitution */

【讨论】:

  • 是的,我现在明白了,但是为什么 httpd 出错了?它是由 Apache 编写的!
【解决方案3】:

$(...) 在子shell 中执行它的内容,它没有得到变量的值。你可以只使用普通的$APACHE_HOME${APACHE_HOME},听起来你切换到了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多