Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash变量插值用连字符或下划线分隔变量_Bash_Variables_String Interpolation - Fatal编程技术网

bash变量插值用连字符或下划线分隔变量

bash变量插值用连字符或下划线分隔变量,bash,variables,string-interpolation,Bash,Variables,String Interpolation,这是一个简单的脚本,用于查看文件是否已下载。在这个脚本上,find命令的计算结果总是为零——即使它没有找到任何东西。所以我把它注释掉了 在filename=“day\u CTRwFEES\u hoo01M”上,我不得不在文件名的末尾添加下划线 使用下划线$filename_$forday.CSV将两者分开是不起作用的。-我必须去掉下划线,将其添加到文件名中,然后组合变量使其像这样工作-$filename$forday 如果不在变量$filename的末尾添加下划线,如何使其工作 #!/bin/b

这是一个简单的脚本,用于查看文件是否已下载。在这个脚本上,find命令的计算结果总是为零——即使它没有找到任何东西。所以我把它注释掉了

filename=“day\u CTRwFEES\u hoo01M”
上,我不得不在文件名的末尾添加下划线

使用下划线
$filename_$forday.CSV
将两者分开是不起作用的。-我必须去掉下划线,将其添加到文件名中,然后组合变量使其像这样工作-
$filename$forday

如果不在变量
$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变量名的结尾

"${filename}_$yesterday.CSV"

你可以用反斜杠来做

# filename=test
# yesterday=somedate
# echo $filename_$yesterday.csv
somedate.csv
# echo $filename\_$yesterday.csv
test_somedate.csv
#
有几种可能性:

  • 最自然的方法是:将变量名用花括号括起来(Ignacio Vazquez Abrams的解决方案):

  • 由于分隔符是一个非常特殊的字符,因此可以使用反斜杠(Sriharsha的Kallury解决方案):

  • (Ab)使用引号:

    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"
    

(可以在本文中添加其他方法)。

在bash脚本中,始终使用${}来解释变量名是一个好习惯。现在就开始做:-)
final=$filename
final+=_$yesterday.CSV
echo "$final"
final=$filename
final+=_
final+=$yesterday
final+=.CSV
echo "$final"
printf -v final "%s_%s.CSV" "$filename" "$yesterday"
echo "$final"