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中还有一个“[[ ]]”,它是“[ ]”的提高版本,它是一个关键字而不是一个程序。
“[[ ]]”支持正则匹配。
测试不会展示任何结果,只会有真和假两种结果。
[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的元字符,*代表任意字符,?代表任意一个字符,[ ]代表中括号内的任意一个字符

浙公网安备 33010602011771号