【问题标题】:Variable Expansion when using variable within filename [duplicate]在文件名中使用变量时的变量扩展[重复]
【发布时间】:2020-01-07 09:14:36
【问题描述】:

使用 Bash 时,我想 WGET 来自服务器的多个文件,因此我编写了一个带有 For 循环的脚本,该循环递增一个计数器以匹配文件的编号。

但我想包含文件的标题和文件出现的顺序(文件的“ID”)。所以该文件的URI为“example.com/files/hello_world.txt”,ID为42,标题为“Hello World”,当WGET它时,下载的文件名称应为“42_Hello_World.txt” ”。

我尝试了以下代码:

#! /bin/bash

# Init
index=42
title="Hello World"

# Replace blanks with underscore
title=${title/ /_}

# Concat fileName
fileName="$index_$title.txt"
echo $fileName

但输出只是“Hello_World.txt”。当我更改 $title 和 $index 的顺序时,输出为“42.txt”

有人可以向我解释为什么会发生这种情况以及如何解决吗?

tl;博士 在评估字符串时在 bash 中使用两个或多个变量时,只有最后一个变量被“扩展”。第一个被忽略。为什么???

【问题讨论】:

  • 您的 tl;dr 错误地识别了问题;两个变量都扩展了,但第一个扩展没有使用您认为的名称。

标签: bash


【解决方案1】:

_ 是标识符的有效字符,因此 $index_$title.txt 被解释为两个参数扩展的串联,$index_$title。要明确分隔参数名称,请使用完整的 ${...} 形式:

fileName=${index}_$title.txt

$title 不需要大括号,因为以下 . 不能解释为参数名称的一部分(尽管大括号当然是允许的:${index}_${title}.txt)。

由于未定义index_$index_ 扩展为空字符串。

【讨论】:

    【解决方案2】:

    是的。解释是_ 字符是变量名中的有效字符,因此您的表达式将(未定义的)变量$index_$title_ 扩展为空字符串。 (. 不是有效的名称字符,因此它会自动终止第二个名称。)改为这样做:

    $ fileName="${index}_$title.txt"
    $ echo $fileName
    42_Hello_World.txt
    $ echo "${title}_$index.txt"
    Hello_World_42.txt
    

    【讨论】:

      【解决方案3】:

      请您尝试以下操作。此更改应为您提供预期的结果。很简单,您的变量 "$index_$title.txt" 被认为是连接 2 个变量(index_title),因此最好引用 _ 之类的 --> "_" 并告诉 shell 它是一个字符串。

      index="42"
      str="Hello World"
      # Replace blanks with underscore
      title=${str/ /_}
      # Concat fileName
      fileName=$index"_"$title".txt"
      echo $fileName
      

      在这个漂亮的 url 中,您可以看到 VALID 变量的最后一个示例(_ 在列表中):

      https://bash.cyberciti.biz/guide/Rules_for_Naming_variable_name

      【讨论】:

        【解决方案4】:

        文件名中的_ 没有帮助。 _ 是一个有效的变量字符,bash 认为您需要一个名为 $index_ 的变量,后跟 $title,这不是您想要的。您可以:

        1. 将下划线字符更改为无效的变量名
        2. 更改为filename=$title"_"$index".txt"
        3. $index 周围加上括号

        希望这会有所帮助!

        编辑:你已经在这里有了答案! How to echo "$x_$y" in Bash script?

        【讨论】:

          猜你喜欢
          • 2011-09-13
          • 1970-01-01
          • 2021-07-05
          • 2011-09-14
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2020-09-22
          • 1970-01-01
          相关资源
          最近更新 更多