#!/bin/bash
yesterday= date --date="1 day ago" +%Y%m%d | tr -d '\n'
remote_file="76.99.20.129\$yesterday.zip"
echo $remote_file
输出:
2012010476.99.20.129$yesterday.zip
这里发生了什么?
我想将此变量传递给wget调用并自动下载文件
答案 0 :(得分:3)
这里有两个问题。第一个是你实际上没有在变量中捕获date命令的输出:
pax> yesterday= date --date="1 day ago" +%Y%m%d | tr -d '\n'
20120105pax@pax-desktop:~$ echo $yesterday
<<no output>>
你的命令正在做的是在运行yesterday
命令期间将date
设置为空字符串,这是一个漂亮的bash
功能我称之为一次性环境设置但bash
几乎可以肯定地称其他东西。这与以下内容没有什么不同:
xyzzy=plugh dosomething
其中dosomething
命令在其环境中具有xyzzy
的条目,但是在返回时,启动它的shell不会。请注意,这与:
export xyzzy=plugh
dosomething
# Here xyzzy is still set.
第二个是你正在逃避$
,这意味着不会触及变量。
尝试:
pax> yesterday=$(date --date="1 day ago" +%Y%m%d)
pax> remote_file="76.99.20.129_${yesterday}.zip"
pax> echo ${remote_file}
76.99.20.129_20120105.zip
我把下划线放在一边,这样你就可以清楚地看到描述。删除它以获得您最初想要的行为(我认为)。
如果您实际使用的字符串中应包含反斜杠,则需要将其转义,以免影响$
:
pax> yesterday=$(date --date="1 day ago" +%Y%m%d)
pax> remote_file="76.99.20.129\\${yesterday}.zip"
pax> echo ${remote_file}
76.99.20.129\20120105.zip
请注意上面的 double \
以实现转义。
您还会注意到我已使用{}
包围了环境变量名称。这是一种很好的做法,可以避免出现问题(例如)将字母d
添加到环境变量abc
的内容中。
命令echo $abcd
将为您提供abcd
环境变量的内容,而您需要的是echo ${abc}d
。我总是喜欢这种明确的符号。
另外,感谢holygeek,tr -d '\n'
在这种情况下并不是必需的,所以我也删除了它。
答案 1 :(得分:1)
使用${}
来逃避:
remote_file="76.99.20.129\\${yesterday}.zip"