${}、$()、$(())、$[]功能很丰富,当然也可以使用其他命令代替,但如果你喜欢了它,会发现原本几行的命令,让你一行或者几个字符解决,岂不美哉!
常用功能(后期慢慢完善!)
$(command) 等价于 `command`
$(())支持expr运算(注:expr 运算需要空格分割、且*乘法需要转义)
${}取值(注:以键盘$为分割,$左侧为#,右侧为%。请记忆!!!)
${}取字节,(注:冒号分割取字符串)
$[]代替let
$(command) 等价于 `command`
这个比较简单没事说的,用了就知道!
#获取主机ip
IP=`hostname -i |awk '{print $2}'`
$(())支持expr运算
这个比单独使用expr方便很多,expr中*是需要转义的,当然,这里也不支持浮点,如果需要浮点还是awk方便很多
$[]与\$(())用途一致:用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些: \+ – * / % & | ^ ! AND、OR、XOR、NOT运算
${}
这个功能有点多!
字符串拼接
#在某些时候,如_和/是无法直接拼接的,这时候可以使用${}进行拼(单次拼接比使用比变量方便很多)
#如
VAR=/home/oracle
echo ${VAR}/db_1
取字节
取字节,这个偶尔会用到,过滤条件时用的较多。(awk配合substr也可以取字节)
做个范例:100到1000之间的水仙花数
for i in ` seq 100 1000`
do
#(默认0开头)第0位字节开始,取1个值
bai=${i:0:1}
#(默认0开头)第1位字节开始,取1个值
shi=${i:1:1}
#(默认0开头)第2位字节开始,取1个值
ge=${i:2:1}
VAR=$((ge*$ge*$ge+$shi*$shi*$shi+$bai*$bai*$bai))
if [ $VAR -eq $i ];then
echo "水仙花:$i"
fi
done
注:${#var} 可计算出变量的长度:
看到水仙花,顺带来个九九乘法表(小思路:行列相等)
#i代表行号,j代表列号!echo -n不换号、$'\t'代表tab键
for i in `seq 1 9`
do
for j in `seq 1 $i `
do
X=`expr $j \* $i`
echo -n "$j*$i=$X" $'\t'
done
echo
done
取值
取值的问题,我一般习惯使用awk、cut,当然dirname、basename也都可以,只是看自己需求。
注:以键盘$为分割,$左侧为#,右侧为%。请记忆!!!(*代表要删除的内容,#代表分隔符左边部分,%代表分隔符右边部分,##、%%代表贪婪模式,但#、%代表遇到的第一个)
如:LOGPATH=/var/log/nginx/access.log
取出文件名:
取出路径:
变量替换
这个我用的比较少,一般是sed或者tr了,百度了一下,贴上以备不时之需。
这个我其实用的比较少,一般都sed或者tr了。但可以做个记录!
定义一个变量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换获得不同的值:
${file#/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##/} 拿掉最后一个 / 及其左边的字符串:my.file.txt
${file#.} 拿掉第一个 . 及其左边的字符串:file.txt ${file##.} 拿掉最后一个 . 及其左边的字符串:txt
${file%/} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/} 拿掉第一个 / 及其右边的字符串:(空值)
${file%.} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${加粗样式file%%.} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
单一符号是最小匹配,两个符号是最大匹配。
${file:0:5} 提取最左边的 5 个字节:/dir1
${file:5:5} 提取第 5 个字节右边的连续 5 个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path} 将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 将全部 dir 替换为 path:/path1/path2/path3/my.file.txt
${!var}是引用间接变量
这个变量嵌套的时候可以使用,而且很方便!
$[]可以替换let命令
印象中最早看到类似i++的是VB中的i=i+1里看到的,到后来的c++,再到sehll,以及最近看到python里有看到过,应该说是编程里的通用的吧,毕竟前人的成果都是后人的垫脚石。
let i++ | $[i+=1] |
let i– | $[i-1] |
又如:
let i+=2 | $[i=i+2] |
let i-=2 | $[i=i-2] |
let i*=2 | $[i=i*2] |
let i/=2 | $[i=i/2] |
let i%=2 | $[i=i%2] |
哎,存稿太多,没时间完善。。。发现存稿里有去年的,而且存稿有30多篇,真的是没时间完善,哎,后期慢慢补吧。
发表评论