Bash变量内插,使用连字符或下划线分隔多个变量

4

这是一个简单的脚本,只是为了查看文件是否已经下载。在此脚本中,即使未找到任何内容,find命令始终评估为零。因此我将其注释掉了。

filename="day_CTRwFEES_hoo01M_"上,我不得不在文件名的末尾添加下划线。

使用下划线$filename_$yesterday.CSV来分隔两个变量无法正常工作。我必须将下划线删除,将其添加到文件名中,然后组合变量使其像这样工作 - $filename$yesterday

我怎样才能使其在不添加下划线到$filename变量末尾的情况下正常工作?

#!/bin/bash
set -x
dayofweek=$(/bin/date +%w)
today=$(/bin/date +%Y%m%d)
yesterday=$(/bin/date -d "1 day ago" +%Y%m%d)
friday_morning=$(/bin/date -d "3 days ago" +%Y%m%d)
filename="day_CTRwFEES_hoo01M_"

#if find /data/today/ -type f -name "$filename_$yesterday.CSV" ; then
if ls "/data/today/$filename$yesterday.CSV" ; then
    echo "successful"
else
    echo "$filename$yesterday.CSV was not downloaded, please check." | mail -s "$filename$yesterday.CSV not downloaded" casper@big_bank.com
    fi

casper@good_host5981dap:~/walt/morning_checks$ ./check_day_CTRwFEES_hoo01M
++ /bin/date +%w
+ dayofweek=5
++ /bin/date +%Y%m%d
+ today=20141024
++ /bin/date -d '1 day ago' +%Y%m%d
+ yesterday=20141023
++ /bin/date -d '3 days ago' +%Y%m%d
+ friday_morning=20141021
+ filename=day_CTRwFEES_hoo01M_
+ ls data/today/day_CTRwFEES_hoo01M_20141023.CSV
/data/today/day_CTRwFEES_hoo01M_20141023.CSV
+ echo successful
successful

~

3个回答

10
通过告诉bash变量名的结束位置。
"${filename}_$yesterday.CSV"

在bash脚本中,始终使用${}来解释变量名称是一个好习惯。现在就开始做吧 :-) - Jan

3

有几种可能性:

  • The most natural one: enclose your variable name in curly brackets (Ignacio Vazquez-Abrams's solution):

    echo "${filename}_$yesterday.CSV"
    
  • Since your separator is a rather special character, you may use a backslash (Sriharsha's Kallury's solution):

    echo "$filename\_$yesterday.CSV"
    
  • (Ab)use quotes:

    echo "$filename""_$yesterday.CSV"
    

    or

    echo "$filename"_"$yesterday.CSV"
    
  • Use an auxiliary variable for the separator:

    sep=_
    echo "$filename$sep$yesterday.CSV"
    
  • Use an auxiliary variable for the final string, and build it step by step:

    final=$filename
    final+=_$yesterday.CSV
    echo "$final"
    

    or in a longer fashion:

    final=$filename
    final+=_
    final+=$yesterday
    final+=.CSV
    echo "$final"
    
  • Use an auxiliary variable for the final string, and build it with printf:

    printf -v final "%s_%s.CSV" "$filename" "$yesterday"
    echo "$final"
    

(欢迎在本帖中添加其他方法。)


注:此句话是在提醒读者可以在这篇文章中自由地添加其他方法。

0

你可以使用反斜杠来实现。

# filename=test
# yesterday=somedate
# echo $filename_$yesterday.csv
somedate.csv
# echo $filename\_$yesterday.csv
test_somedate.csv
#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接