【问题标题】:Shell script: call command containing variableShell 脚本:调用包含变量的命令
【发布时间】:2017-04-27 22:52:48
【问题描述】:

这个脚本有什么问题?

#!/bin/sh
SONAR="~/SonarQube/bin/linux-x86-64/sonar.sh"
echo "Waiting to start..."
$($SONAR start)

上面写着./start.sh: 4: ./start.sh: ~/SonarQube/bin/linux-x86-64/sonar.sh: not found,但它确实存在。我尝试了很多只适用于 eval 的变体:eval $SONAR start

【问题讨论】:

  • 我目前无法访问 bourne shell,但您可以尝试在 /bin/sh..."#!/bin/sh -x" 之后添加 -x将在执行命令之前回显命令。这可能会让您更深入地了解实际发生的情况。

标签: bash shell unix sh


【解决方案1】:

试试这个:

#!/bin/sh
SONAR=~/"SonarQube/bin/linux-x86-64/sonar.sh"
echo "Waiting to start..."
"$SONAR" start

通过引用禁用波浪号扩展(如通配符),因此您需要将波浪号放在引号之外。

最后一行不应该在$()内,因为这样做首先执行命令,然后扩展内容并尝试执行由该内容表示的命令。

【讨论】:

  • 请再试一次,我修改了代码,斜线也需要在双引号之外。
  • 请注意,我在 $SONAR 扩展周围添加了双引号,以防路径包含可能触发分词的字符(例如空格)。
【解决方案2】:

脚本通常使用$HOME 而不是~$HOME 甚至会在双引号内展开。

#!/bin/sh
SONAR="$HOME/SonarQube/bin/linux-x86-64/sonar.sh"
echo "Waiting to start..."
"$SONAR" start

【讨论】:

    【解决方案3】:

    您在双引号之间使用了~,因此它不会被解释为/home/whatever

    #!/bin/sh
    SONAR=~/SonarQube/bin/linux-x86-64/sonar.sh
    

    【讨论】:

    • 我不知道 biowep 为什么这样做,所以既然问题不在于这部分,我认为不值得改变。
    • 这肯定至少需要一个警告,因为在波浪号扩展方面需要帮助的人很可能不完全理解这一行。
    • @yoones 我想将命令的输出验证为 if。为了更快地阅读,我只提供了暴露问题所需的最少代码量。
    • @biowep 好的,我删除了该行。如果这回答了您的问题,请接受它作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多