在我们编写 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 都是对应字符的下标,而后面这种方法是指定字符串
这里的 #可以换成 % 又是另一种结果,有兴趣可以查询下。
来源: http://www.tuicool.com/articles/FFjMJvI