之前寫過一個根據日期和時間自動命名文件名的時候遇到一個問題。
#! /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
