简体   繁体   中英

bash scripting yesterdays zip file

#!/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

output:

2012010476.99.20.129$yesterday.zip

What is going on here?

I want to pass this variable to a wget call and automatically download a file

Two problems here. The first is that you're actually not capturing the output of the date command in the variable:

pax> yesterday= date --date="1 day ago" +%Y%m%d | tr -d '\n'
20120105pax@pax-desktop:~$ echo $yesterday
<<no output>>

What that command of yours is doing is setting yesterday to an empty string for the duration of running the date command, a nifty bash feature I call the one-shot environment setting but which bash almost certainly calls something else. It's no different to:

xyzzy=plugh dosomething

in which the dosomething command has an entry for xyzzy in its environment but, on return, the shell that started it doesn't. Note that this is different from:

export xyzzy=plugh
dosomething
# Here xyzzy is still set.

The second is that you're escaping the $ , meaning the variable won't be touched.

Try:

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

I put the underscore in just so you could see the delineation clearly. Remove it to get the behaviour (I think) you originally intended.

If the string you're actually after should have the backslash in it, you'll need to escape that so it doesn't affect the $ :

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

Note the double \\ above to achieve the escaping.

You'll also note that I've surrounded environment variable names with {} . This is good practice to avoid problems where you want to add (for example) the letter d to the contents of the environment variable abc .

The command echo $abcd will give you the contents of the abcd environment variable whereas what you need is echo ${abc}d . I always prefer this explicit notation.

In addition, thanks to holygeek, the tr -d '\\n' is not really necessary in this case, so I've removed it as well.

使用${}来逃避:

remote_file="76.99.20.129\\${yesterday}.zip"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM