在文件名中使用变量时的变量扩展

时间:2019-09-04 13:03:27

标签: bash

使用Bash时,我想从服务器上WGET多个文件,所以我编写了一个带For循环的脚本,该脚本会增加一个计数器以匹配文件的编号。

但是我想包括文件标题和文​​件显示顺序的编号(文件的“ ID”)。因此,该文件的URI为“ example.com/files/hello_world.txt”,ID为42,在WGET时的标题为“ Hello World”,因此下载的文件应具有名称“ 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中使用两个或多个变量评估字符串时,仅最后一个变量被“扩展”。第一个被忽略。为什么?

4 个答案:

答案 0 :(得分:2)

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

fileName=${index}_$title.txt

$title不需要大括号,因为后面的.不能解释为参数名称的一部分(尽管肯定可以使用大括号:${index}_${title}.txt)。

由于未定义index_,因此$index_会扩展为空字符串。

答案 1 :(得分:2)

是的。解释是_字符是变量名中的有效字符,因此您的表达式将(未定义)变量$index_$title_扩展为空字符串。 (.不是有效的名称字符,因此它会自动终止第二个名称。)相反,请执行以下操作:

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

答案 2 :(得分:1)

能否请您尝试以下。此更改将为您提供预期的结果。很简单,在连接两个变量("$index_$title.txt"index_)时考虑变量title,所以最好像-> _一样引用"_"并告诉shell它是一个字符串。

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

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

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

答案 3 :(得分:0)

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

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

希望这会有所帮助!

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