linux 关${}、$()、$(())、$[]

linux 关${}、$()、$(())、$[]

${}、$()、$(())、$[]功能很丰富,当然也可以使用其他命令代替,但如果你喜欢了它,会发现原本几行的命令,让你一行或者几个字符解决,岂不美哉!

常用功能(后期慢慢完善!)

$(command) 等价于 `command`

$(())支持expr运算(注:expr 运算需要空格分割、且*乘法需要转义)

${}取值(注:以键盘$为分割,$左侧为#,右侧为%。请记忆!!!)

${}取字节,(注:冒号分割取字符串)

$[]代替let

$(command) 等价于 `command`

这个比较简单没事说的,用了就知道!

#获取主机ip
IP=`hostname -i |awk '{print $2}'`
https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-11.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

$(())支持expr运算

这个比单独使用expr方便很多,expr中*是需要转义的,当然,这里也不支持浮点,如果需要浮点还是awk方便很多

$[]与\$(())用途一致:用来作整数运算。在 bash 中,$(( ))的整数运算符号大致有这些: \+ – * / % & | ^ ! AND、OR、XOR、NOT运算

https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-15.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

${}

这个功能有点多!

字符串拼接

#在某些时候,如_和/是无法直接拼接的,这时候可以使用${}进行拼(单次拼接比使用比变量方便很多)
#如
VAR=/home/oracle
echo ${VAR}/db_1
https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-12.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

取字节

取字节,这个偶尔会用到,过滤条件时用的较多。(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} 可计算出变量的长度:

https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-13.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

看到水仙花,顺带来个九九乘法表(小思路:行列相等)

#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

取出文件名:

https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-16.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

取出路径:

https://qnimg.ffing.cn/wp-content/uploads/2022/03/image-17.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

变量替换

这个我用的比较少,一般是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多篇,真的是没时间完善,哎,后期慢慢补吧。

good good study, day day up!

发表评论

textsms
account_circle
email

linux 关${}、$()、$(())、$[]
${}、$()、$(())、$[]功能很丰富,当然也可以使用其他命令代替,但如果你喜欢了它,会发现原本几行的命令,让你一行或者几个字符解决,岂不美哉! 常用功能(后期慢慢完善!)…
扫描二维码继续阅读
2022-03-08