一、变量替换
语法 | 含义 |
---|---|
${变量#pattern} | 从开头匹配,删除0第一个匹配到字符删除。双#表示删除0匹配到的最后一个字符呢删除 |
${变量%patther} | 从尾部开始匹配,从尾部开始删除,其他同上 |
${变量/oldstr/newstr} | 匹配第一个替换,双//表示全部替换 |
var1=${variable_1#*ov}
var2=${variable_1##*ov}
echo "# *ov匹配结果:" $var1
echo “## *ov匹配结果:” $var2
var3=${variable_1%ov*}
var4=${variable_1%%ov*}
echo "% ov*匹配结果:" $var3
echo '%% ov*匹配结果:' $var4
var5=${variable_1/love/hate}
var6=${variable_1//love/hate}
"var_replace.sh" 26L, 407C
测试结果
[root@server1 shell]# sh var_replace.sh
# *ov匹配结果: e shell,but it is so hard,do you love it
“## *ov匹配结果:” e it
% ov*匹配结果: I love shell,but it is so hard,do you l
%% ov*匹配结果: I l
I hate shell,but it is so hard,do you love it
I hate shell,but it is so hard,do you hate it
重点掌握替换即可,前两种场景较少,可以通过其他方式替代
二、字符串常用处理
获取字符串长度
# 方法1
${#string}
# 方法2
expr length "$string"
获取字符位置(忽略)
这里index的下标1而不是0开始,建议忽略本段
比较鸡肋的功能,是把后面字符串拆解后,第一个字符匹配到的位置
expr index $string str
这里搜索d和l字符在字符串中第一次出现的位置,L先出现第3位所以数字式3
[root@server1 shell]# var="hellowrod"
[root@server1 shell]# echo `expr index $var dl`
3
[root@server1 shell]# echo `expr match $var *llo`
0
[root@server1 shell]# echo `expr match $var hello`
5
截取字符串
方法很多我们只记住一种即可,索引下标从0开始
# 方法1
${string:start:length} 从start开始提取长度为length的字符串
# 方法2
expr substr $string $position $length
#!/bin/bash
#length test
var="hello world"
var1len=${#var}
var1len2=`expr length "$var"`
echo $var1len "|" $var1len2
# substr test
varsub1=${var:2:3}
# 变量需要双引号,原因不明
varsub2=`expr substr "$var" 2 3`
echo "substr 2:3" $varsub1 "|" $varsub2
测试结果
[root@server1 shell]# sh substr.sh
11 | 11
substr 2:3 llo | ell
三、命令替换
将命令执行结果赋值变量
# 方法1
`command`
# 方法2
$(command)
#!/bin/bash
for user in `cat /etc/passwd | cut -d ":" -f 1`
do
echo $user
done
# 示例2
[root@server1 ~]# echo "next year is $(($( date +%Y ) + 1))"
next year is 2022
$() 和 $(())
- 一个括号代表命令替换
- 两个括号代表算数元素那
`` 和 $()
- 两者基本对等
- $()在某些unix系统可能不支持,但支持嵌套
- 反引号在嵌套时需要转义
四、有类型变量
参数 | 含义 |
---|---|
-r | 只读 |
-i | 整形,shell默认把变量当做字符串 |
-a | 数组 |
-x | 声明为环境变量 |
# 只读变量
[root@server1 shell]# declare -r var
[root@server1 shell]# var=helo3
-bash: var: readonly variable
# 整形变量
# 数组
[root@server1 shell]# declare -a array1
[root@server1 shell]# array1=("zhangsan" "lisi" "wangwu")
[root@server1 shell]# echo array1[@]
array1[@]
[root@server1 shell]# echo ${array1[@]}
zhangsan lisi wangwu
[root@server1 shell]# echo ${array1[1]}
lisi
五、数学运算
# 方法1
expr $num1 operator $num2
$(($num1 operator $num2))
不能用来比较,只能加减乘除
操作符 | 含义 |
---|---|
num1 | num2 | num1非空非零返回num1,否则返回num2 |
num1 & num2 | num1非空非零返回num1,否则返回0 |
表达式 | 表达式为真返回1,否则返回0
[root@server1 shell]# num1=30
[root@server1 shell]# num2=50
# 需要转义
[root@server1 shell]# expr $num1 > $num2
[root@server1 shell]# expr $num1 \> $num2
0
[root@server1 shell]# expr $num1 + $num2
80
[root@server1 shell]# expr $num1 / $num2
0
第二种语法
[root@server1 shell]# echo $((num1%num2))
30
示例,提示输入数字,判断数据合法性,并计算求和结果
通过脚本联系增加对shell细节的理解
#/bin/bash
while true
do
read -p "pls input a positive numbser:" num
# 判断变量是否为正整数
# 整数才能原酸
expr $num + 1 &> /dev/null
if [ $? -eq 0 ];then
if [ `expr $num \> 0` -eq 1 ];then
echo "yes,$num is a positive numbser"
sum=0
for ((i=1; i<=$num; i++))
do
sum=$((sum + $i ))
done
echo "sum is $sum"
exit
else
echo "no"
fi
fi
echo "erro input"
done
浮点数运算
bc指定scale可以进行浮点值的运算,scale=n可以指定小数后位数
# 交互式方式
[root@server1 shell]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
3+t
3
3+5
8
3/5
0
scale=2
3/5
.60
# 脚本中写法
[root@server1 shell]# echo "scale=2;$((3/5))" | bc
0
[root@server1 shell]# echo "scale=2;3/5" | bc
.60