小符號反映大問題,Shell中下划線_與變量的關系。


之前寫過一個根據日期和時間自動命名文件名的時候遇到一個問題。

#! /bin/bash
read -p "please input the filename:" filename

date3=$(date -d '2 days ago' +%Y%m%d)

echo $date3
touch /home/${filename}_${date3}
touch /home/$filename"_"$date3
touch /home/"$filename_$date3"

輸出為三個文件

23:22 20130329
23:22 underline_20130329
23:22 underline_20130329

不是應該三個都一樣么,都是filename_date的格式嗎,

后來換成了短橫線,

#! /bin/bash
read -p "please input the filename:" filename

date3=$(date -d '2 days ago' +%Y%m%d)

echo $date3
touch /home/${filename}-${date3}
touch /home/$filename"-"$date3
touch /home/"$filename-$date3"

輸出的文件為:

23:24 dash-20130329
23:24 dash-20130329
23:24 dash-20130329

如果自動命名的文件的分隔符用短橫線就沒有問題,為什么會這樣呢。

后來經過學習和研究

shell變量名后面要跟如下內容:非小寫字符串(包括大小字符串)、數字或下划線,要么用轉義字符“\”或者變量名用大括號。否則就會向本例中shell試圖使用filename_作為變量名。除非出現$filename_已經存在的偶然情況,否則該語句不會打印任何內容(為null或空字符串),這就是第一次為什么輸出的是文件 20130329的原因。

在shell中,取一個變量值的方法 $varname的語法實際上是常用語法${varname}的簡寫形式,不管是避免歧義,還是增加可讀性,變量加打括號都是一個很好的習慣,不要偷懶不加喲。

P.S. 簡易的例子
[root@Linux mybash]# a=a
[root@Linux mybash]# b=b
[root@Linux mybash]# echo $a$b
ab
[root@Linux mybash]# echo $a_$b
b
[root@Linux mybash]# echo $a\_$b
a_b
[root@Linux mybash]# echo ${a}_${b}   #推薦方法
a_b
[root@Linux mybash]# echo "$a"_"$b"
a_b
[root@Linux mybash]# echo $a"_"$b
a_b

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM