在我們編寫shell的時候會有這樣一個種場景:
比如:我要備份passwd這個文件,備份到bak_path=”/mnt/sql_bak/” 這個路徑下。
且文件名為bak?
習慣上shell是這樣:
#!/bin/sh bak_path="/mnt/bak/" cp $/etc/passwd $bak_pathbak
但是這樣會發現$bak_pathbak 這個系統會把它作為一個變量名的,而不是根據上面變量,然後追加一個bak。實際上想解決這個問題有兩種辦法,一種 bak_path中最後不要加”/” 即 bak_path=”/mnt/bak”.
然後 cp $/etc/passwd $bak_path/bak 這樣即可。第二種就是今天要說的 ${} 。bak_path=”/mnt/bak” 路徑還是這個。下面cp $/etc/passwd ${bak_path}bak 這樣即可。
第二種場景 必須你shell中要對一個命令的結果做操作這時候就要用到$()
比如:我要對一個進程執行kill,我要關掉pid為1915這個tomcat
首先我得先拿到這個pid。ps -ef|grep java|egrep -o “[1-9]{4}”|head -n1 ,然後kill -9 pid 即可。
一條命令就是 kill -9 $(ps -ef|grep java|egrep -o “[1-9]{4}”|head -n1)即可。
補充一種場景比如你要計算25*125等於多少 (類似計算器運算) windows用戶會用calc調用系統計算器算。那linux呢 可以用echo $((25*125)) 就可以了。
另外關於${} 這個的用法不簡單限制於 變量限制擴展的功能,可以還可以用來切分字符串
比如str=”123″ 我要取23,正向取就是 echo ${str:1:2} 意思是從第一位往後開始不包括第一位,取兩位。
再比如str=”abc” 取bc,一樣 echo${str:1:2}
或者 echo ${str#*1} echo ${str#*a} 也可以。這個意思就是去掉1 左邊包括1;去掉a包括a。跟上面的區別在於上面的 1,2 都是對應字符的下標,而後面這種方法是指定字符串
這裡的#可以換成% 又是另一種結果,有興趣可以查詢下