Linux shell编程2---shell变量进阶

一、数字类型的常用操作 加减乘除取余
比大小

二、字符串类型的常用操作
  统计变量值的长度(字符的个数)

[root@localhost.localdomain ~]# url="http://www.baidu.com"
[root@localhost.localdomain ~]# echo ${#url}
20
[root@localhost.localdomain ~]# echo $url |wc -L
20
[root@localhost.localdomain ~]# echo $url |awk '{print length}'
20
[root@localhost.localdomain ~]# expr length "$url"
20

  切片(就是从一个大字符串当中,拷贝出一个子字符串) 指定起始位置,指定往后切几位(包含自己在内)。不指定起始位置默认就是从索引0开始,不指定切几位默认就是切到末尾。

[root@localhost.localdomain ~]# msg="name zrg age 32 langue python linux go"
[root@localhost.localdomain ~]# echo ${msg:8:7}
age 32

  截断(默认是砍掉左边,%是从右往左砍,还有贪婪非贪婪)

[root@localhost.localdomain ~]# rul="https://www.cnblogs.com/zhangrenguo/p/18904378"
[root@localhost.localdomain ~]# echo ${rul%04378}
https://www.cnblogs.com/zhangrenguo/p/189
[root@localhost.localdomain ~]# url="www.sina.com"
[root@localhost.localdomain ~]# echo ${url#www.}
sina.com

  替换

[root@localhost.localdomain ~]# rul="https://www.cnblogs.com/zhangrenguo/p/18904378"
[root@localhost.localdomain ~]# echo ${rul/cnblogs/csdn}
https://www.csdn.com/zhangrenguo/p/18904378
[root@localhost.localdomain ~]# rul="https://www.cnblogs.com/zhangrenguo/p/18904378"
[root@localhost.localdomain ~]# echo ${rul//n/N}
https://www.cNblogs.com/zhaNgreNguo/p/18904378
[root@localhost.localdomain ~]# ll test
ls: 无法访问test: 没有那个文件或目录
[root@localhost.localdomain ~]# ll /test
总用量 0
[root@localhost.localdomain ~]# cd /test
[root@localhost.localdomain /test]# touch zrg_2025_{1..5}_linux.txt
[root@localhost.localdomain /test]# ls
zrg_2025_1_linux.txt  zrg_2025_3_linux.txt  zrg_2025_5_linux.txt
zrg_2025_2_linux.txt  zrg_2025_4_linux.txt
[root@localhost.localdomain /test]# for i in $(ls);do mv $i ${i/_linux/}; done; 
[root@localhost.localdomain /test]# ls
zrg_2025_1.txt  zrg_2025_2.txt  zrg_2025_3.txt  zrg_2025_4.txt  zrg_2025_5.txt
应用示例:批量修改文件名称

 

三、元字符

算术运算符
  +
  -
  *
  /
  %
算数运算符针对的是数字类型,整型或者浮点型,bc工具适用于浮点运算,整数运算有expr、$(())、$[]、let

bc工具支持浮点型和整数。如果有特殊符号可以用双引号引起来或者用左斜杠转义。

[root@localhost.localdomain ~]# echo 1+1 |bc
2
[root@localhost.localdomain ~]# echo 3*6 |bc
18
[root@localhost.localdomain ~]# echo "3 * 6" |bc
18
[root@localhost.localdomain ~]# echo 7/3 |bc
2
[root@localhost.localdomain ~]# echo "scale=2;7/3" |bc
2.33

scale=2 指定保留两位小数位。

[root@localhost.localdomain ~]# echo "3.7+4.4" |bc
8.1

expr 需要注意的是运算符号左右两边要留空格

[root@localhost.localdomain ~]# expr 7+8
7+8
[root@localhost.localdomain ~]# expr 7 + 8
15
[root@localhost.localdomain ~]# expr 7 * 6
expr: 语法错误
[root@localhost.localdomain ~]# expr "7 * 6"
7 * 6
[root@localhost.localdomain ~]# expr 7 \* 6
42

$(()),$是取值的意思,真正做运算的是(())。

[root@localhost.localdomain ~]# echo $((5+8))
13
[root@localhost.localdomain ~]# echo $((5*8))
40
[root@localhost.localdomain ~]# echo $(( (5*8)/4 ))
10

引用变量做计算:

[root@localhost.localdomain ~]# echo $(($x+$y ))
16

$[]

[root@localhost.localdomain ~]# echo $[ 8+7 ]
15
[root@localhost.localdomain ~]# echo $[ x*y ]
63

  支持嵌套:

[root@localhost.localdomain ~]# echo $[ (x*y)%2 ]
1

  let 需要做赋值操作。

[root@localhost.localdomain ~]# let res=1+6
[root@localhost.localdomain ~]# echo $res
7
[root@localhost.localdomain ~]# j=1
[root@localhost.localdomain ~]# i=1
[root@localhost.localdomain ~]# let i++
[root@localhost.localdomain ~]# echo $i
2
[root@localhost.localdomain ~]# let i++
[root@localhost.localdomain ~]# echo $i
3
[root@localhost.localdomain ~]# let ++j
[root@localhost.localdomain ~]# echo $j
2
[root@localhost.localdomain ~]# let ++j
[root@localhost.localdomain ~]# echo $j
3

  expr验证传进来的值是否是一个整数:

[root@localhost.localdomain ~]# read -p "请输入一个整数:" num
请输入一个整数:34
[root@localhost.localdomain ~]# expr 1 + $num &> /dev/null
[root@localhost.localdomain ~]# echo $?
0

 

测试运算符

  test命令等同于中括号[]

在bash中还有一个“[[ ]]”,它是“[ ]”的提高版本,它是一个关键字而不是一个程序。
“[[ ]]”支持正则匹配。
在bash中还有一个“[[ ]]”,它是“[ ]”的提高版本,它是一个关键字而不是一个程序。

 

  测试不会展示任何结果,只会有真和假两种结果。

[root@localhost.localdomain ~]# test -d /etc
[root@localhost.localdomain ~]# echo $?
0

测试文件状态:

  -d

  -f

  -w

  -s

  -r

  -x

  -L

  -u

[root@localhost.localdomain ~]# test -f /etc/passwd
[root@localhost.localdomain ~]# echo $?
0
[root@localhost.localdomain ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1036 5月  22 14:21 /etc/passwd

测试字符串:判断字符串一定要加双引号。

  -n

  -z

  ==

  !=

[root@localhost.localdomain ~]# a="asd"
[root@localhost.localdomain ~]# b="asd"
[root@localhost.localdomain ~]# test “$a” == "$b"
[root@localhost.localdomain ~]# echo $?
0

测试数值:

  -eq 等于 equal

  -ne 不等于 not equal

  -lt 小于 less than

  -gt 大于 greater than

  -ge 大于等于 greater than or equal

  -le 小于等于 less than or equal

  -a 并且 and 连个表达式 both

  -o 或者 or 两个表达式 either

[root@localhost.localdomain ~]# test 10 -gt 3
[root@localhost.localdomain ~]# echo $?
0
[root@localhost.localdomain ~]# c=43
[root@localhost.localdomain ~]# d=32
[root@localhost.localdomain ~]# test $c -gt $d
[root@localhost.localdomain ~]# echo $?
0
[root@localhost.localdomain ~]# echo $?
0

  逻辑与&&

[root@localhost.localdomain ~]# [ 10 -gt 3 ] && [ 3 -ne 2 ]
[root@localhost.localdomain ~]# echo $?
0

  逻辑或||

[root@localhost.localdomain ~]# [ 10 -gt 3 ] || [ 3 -ne 2 ]
[root@localhost.localdomain ~]# echo $?
0

  逻辑非!

  补充浮点数的比较:需要注意的是,bc的结果1代表真,0代表假。

[root@localhost.localdomain ~]# e=84.3
[root@localhost.localdomain ~]# g=55.9
[root@localhost.localdomain ~]# echo "$e >= $g" |bc
1
[root@localhost.localdomain ~]# a=1.5
[root@localhost.localdomain ~]# b=4.4
[root@localhost.localdomain ~]# res=`echo "$a >= $b" |bc`
[root@localhost.localdomain ~]# echo $res
0

 


关系运算符:以下运算符需要配合(())使用。(())属于c语言风格的比较,最终结果都是用来if判断或者while循环的条件。

  >

  <

  >=

  <=

  ==

  !=

  &&

  ||

[root@localhost.localdomain ~]# ((6>4));echo $?
0

 

赋值运算符

  =

  +=

  *=

  /=

  %=

 

四、数组

 

五、补充

[[ ]]支持正则表达式。

匹配当前用户是不是ro开头的:

[root@localhost ~]# echo $USER
root
[root@localhost ~]# [[ "$USER" =~ ^ro ]];echo $?
0

注意:[[ ]] 左右两边的留1个空格,"$USER" 是取值,但是值是字符串必须加引号,=~ 是进行正则匹配的意思,^ro 是正则表达式一定不能加引号。

$ 是以什么结尾

[ ] 一个字符

 

其它元字符:

``和$() 取命令的结果

~ 家目录

.与.. 当前与上一级

! 调历史命令、取反

{ } 

流程控制介绍

  默认来说一个程序的运行都是自上而下依次运行。

if判断单分支

  语法:

if 条件;then
    要执行的命令
    ...
fi
[ 条件信息 ] && xxx

if判断双分支

if 条件;then
    要执行的命令
    。。。。
else
     要执行的命令
     。。。

fi
上述语法可以用一行代码代替
[ 条件信息 ] && xxx || yyy

if判断多分支

if 条件;then
    要执行的命令1
    要执行的命令2
    要执行的命令3
    ...
elif 条件;then
    要执行的命令1
    要执行的命令2
    要执行的命令3
    ...
elif 条件;then
    要执行的命令1
    要执行的命令2
    要执行的命令3
    ...
...
else
    要执行的命令1
    要执行的命令2
    要执行的命令3
    ...
fi

 

if判断练习

case语句基本语法

  case:多个判断条件始终是围绕同一个变量值展开的。

case 变量 in
模式1)
    命令序列1
    ;;
模式2)
    命令序列2
    ;;
模式3)
    命令序列3
    ;;
*)
    无匹配后命令序列
esac

case语句进阶用法

  支持一些简单的shell的元字符,*代表任意字符,?代表任意一个字符,[ ]代表中括号内的任意一个字符

 

posted @ 2025-06-13 14:39  张仁国  阅读(12)  评论(0)    收藏  举报
目录代码