【问题标题】:bash variable interpolation separate variables by a hyphen or underscorebash 变量插值用连字符或下划线分隔变量
【发布时间】:2014-12-20 23:34:15
【问题描述】:

这是一个简单的脚本,用于查看文件是否已下载。在这个脚本中,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

~

【问题讨论】:

    标签: bash variables string-interpolation


    【解决方案1】:

    通过告诉 bash 变量名在哪里结束。

    "${filename}_$yesterday.CSV"
    

    【讨论】:

    • 在 bash 脚本中始终使用 ${} 来解释变量名是一个好习惯。现在开始做吧:-)
    【解决方案2】:

    几种可能性:

    • 最自然的一个:用大括号将变量名括起来(Ignacio Vazquez-Abrams 的解决方案):

      echo "${filename}_$yesterday.CSV"
      
    • 由于您的分隔符是一个相当特殊的字符,您可以使用反斜杠(Sriharsha 的 Kallury 解决方案):

      echo "$filename\_$yesterday.CSV"
      
    • (Ab)使用引号:

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

      echo "$filename"_"$yesterday.CSV"
      
    • 使用辅助变量作为分隔符:

      sep=_
      echo "$filename$sep$yesterday.CSV"
      
    • 对最终的字符串使用辅助变量,并逐步构建它:

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

      或以更长的方式:

      final=$filename
      final+=_
      final+=$yesterday
      final+=.CSV
      echo "$final"
      
    • 对最终字符串使用辅助变量,并使用printf 构建它:

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

    (请随意在这篇文章中添加其他方法)。

    【讨论】:

      【解决方案3】:

      你可以使用反斜杠来做到这一点。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-03
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多