【问题标题】:Can anyone explain me what is going on here in this bash script?谁能解释一下这个 bash 脚本中发生了什么?
【发布时间】:2019-04-14 02:27:33
【问题描述】:

对于这个 UNIX shell 脚本,我必须使用一个有意义的示例输入来 解释目的和任何可能的输出。

str=””
for word in $*
do
    if [$word == Tokyo]
    then
        str = “Capital Japan $str”
    else
        str = “$word $str”
    fi
done

echo str;

【问题讨论】:

  • 该脚本有大约 9 个错误会阻止它做任何有用的事情。你是在问“为什么会失败?”或“它应该做什么?”
  • 老实说,这太简单了,无法在 SO 上寻求帮助!你试过了吗?试验一下?最多,也许$* 不明显....所以查一下!也许here.
  • 我尝试运行它.. 它只是打印 str
  • 作者的意图无疑是让你运行./myscript Sydney Tokyo Reykjavik,它会输出Sydney Capital Japan Reykjavik,但是有一堆错误阻碍了这一点(作者可能应该使用@987654322 @
  • 脚本可能没有运行。引号对我来说看起来不对。另见How to use ShellcheckHow to debug a bash script? (U&L.SE)、How to debug a bash script? (SO)、How to debug bash script? (AskU)、Debugging Bash scripts 等。

标签: linux bash


【解决方案1】:

首先你的代码有错误:

第一个错误:

if [$word == Tokyo]

应该是:

if [ "$word" == Tokyo ]

[ 之后和] 之前的空格,并在 "$word" 周围加上引号以防止分词

接下来:

str = “Capital Japan $str”

应该是:

str="Capital Japan $str"

注意str、等号和"Capital Japan $str"之间没有空格。第 8 行也存在同样的问题。 你也注意到不同的报价。这些是您应该使用的双引号。代码的第一行和第 8 行就是这种情况。

最后,打印出你输入的变量str

echo $str

虽然我确实建议使用引号。喜欢关注

echo "$str"

最后一个错误导致您的脚本打印 str 而不是名为 str 的字符串

【讨论】:

    【解决方案2】:

    您的脚本存在以下问题:

    • [ 后面需要空格,因为它是一个命令。在] 之前还需要一个空格
    • good practice 在 if 语句中引用比较的两边
    • 需要使用双引号,而不是您当前使用的右双引号
    • 分配给变量时需要删除= 周围的空格
    • 无需初始化str
    • 分配str="$word $str" 不清楚

    在这些更正之后,脚本变为:

    # scipt.sh
    for word in $*
    do
        if [ "$word" == "Tokyo" ]
        then
            str="Capital Japan $str"
            echo "$str"
        else
            str="$word"
            echo "$str"
        fi
    done
    

    从 shell 测试脚本:

    $ bash script.sh some Tokyo word
    some
    Capital Japan Tokyo
    word
    

    【讨论】:

    • +1 以获得明确的答案,但您真的需要东京周边的报价吗?它是单个单词,没有特殊字符,应该没问题。另一方面,$word 应该被引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2021-02-16
    相关资源
    最近更新 更多