使用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中使用两个或多个变量评估字符串时,仅最后一个变量被“扩展”。第一个被忽略。为什么?
答案 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
,这不是您想要的。您可以:
filename=$title"_"$index".txt"
或$index
希望这会有所帮助!
编辑:您已经在这里有了答案! How to echo "$x_$y" in Bash script?