目录
10、${parameter//pattern/string}
实验2:假设执行一个可以携带参数的script,执行该脚本后屏幕会显示如下的数据:
一、shell运算符
1、(())
意义:用于整数运算的常用运算符
示例:
[root@localhost ~]# echo $((1 + 1))
2
2、let
意义:用于整数运算
示例:
[root@localhost ~]# let var_a=2*3
[root@localhost ~]# echo $var_a
6
3、expr
意义:可用于整数运算
1)使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则会输出运算式;
2)使用乘号时,必须使用反斜线屏蔽其特定含义;
3)使用expr做 计算,将一个未知的变量和一个已知的整数相加,看返回码是否为 0,如果为0就认为做加法的变量为整数,否则就不是整数。
示例:
#左右要有空格
[root@localhost ~]# expr 1 + 1
2
[root@localhost ~]# expr 1+1
1+1
#做乘法时需要加上\
[root@localhost ~]# expr /2 * 1
[root@localhost ~]# expr 2 \* 1
2
[root@localhost ~]# expr 2 * 1
expr: syntax error: unexpected argument ‘aa~’
4、bc
意义: linux下的一 个计算器程 序(适合整数及小数运算)
示例:
[root@localhost ~]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1 + 5
6
5、$[]
意义:用于整数运算
示例:
[root@localhost ~]# echo $[ 1 + 9 ]
10
6、awk
意义:awk既可以用于整数运算,也可以用于小数运算
示例:
[root@localhost ~]# echo "5.2 4.9" | awk '{print $1 + $2}'
10.1
[root@localhost ~]# echo "5 4" | awk '{print $1 + $2}'
9
7、declare
意义:定义变量值和属性,-i 参数可以用 于定义整形变量,做运算
示例:
[root@localhost ~]# declare -i var_a=2*5
[root@localhost ~]# echo $var_a
10
二、算数运算符
1、+、-
说明:求和、差
示例:
[root@localhost ~]# echo $((1+3))
4
[root@localhost ~]# echo $((1-3))
-2
2、*、/、%
说明:求乘积,商,余数
示例:
[root@localhost ~]# echo $((5*3))
15
[root@localhost ~]# echo $((5/3))
1
[root@localhost ~]# echo $((5%3))
2
3、**
说明:幂运算
示例:
[root@localhost ~]# echo $((5**3))
125
4、+=、-=、*=、/=、%=
说明:例a+=1相当于a=a+1,其余同理
示例:
[root@localhost ~]# var_a=2
[root@localhost ~]# var_a+=1
[root@localhost ~]# echo $var_a
3
5、++variable、- -variable
说明:先将变量variable的值加1,然后再赋给variable; 先将变量variable的值减1,然后再赋给variable
示例:
[root@localhost ~]# var_a=1
[root@localhost ~]# var_b=$((++var_a))
[root@localhost ~]# echo $var_a $var_b
2 2
6、variable++、 variable--
说明:先使用variable的值,然后再将该变量的值加1; 先使用variable的值,然后再将该变量的值减1
示例:
[root@localhost ~]# var_a=1
[root@localhost ~]# var_b=$((var_a--))
[root@localhost ~]# echo $var_a $var_b
0 1
7、位运算符<<、 >>
说明:位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的 某个或者某些位(bit)。例如,2>>1是将二进制形式的2,即10,右移1位,从 而变成1,即1。 左移,4<<2,将4左移2位,结果为16; 右移,8>>2,将8 右移两位,结果为2
示例:
[root@localhost ~]# echo $((2>>1))
1
[root@localhost ~]# echo $((4<<2))
16
8、&、|、~、^
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
说明:按位与,8&4,将8和4进行按位与运算,结果为0; 按位或,8|4,将8和4进行按位运算,结果为12; 按位非,~8,将8进行按位非运算,结果为-9(一个字符占一个字节,即8个二进制位,最高位为1时为负数); 按位异或(a异或b, a、b值不同结果为1,相同结果为0),10^6,将10和6进行按二进制位异或运 算,结果为12。
示例:
[root@localhost ~]# echo $((8&4))
0
[root@localhost ~]# echo $((8|4))
12
[root@localhost ~]# echo $((~8))
-9
[root@localhost ~]# echo $((10^6))
12
9、<<=、>>=
说明:将变量的值左移指定位数之后重新赋给该变量,x<<=3,将x的值左移3位,重新赋给变量x; 将变量的值右移指定位数之后重新赋给该变量,x>>=4,将变量x的值右移4位后重新赋给变量x。
示例:
[root@localhost ~]# var_a=8
[root@localhost ~]# ((var_a<<=1))
[root@localhost ~]# echo $var_a
32
10、&=、|=、^=
说明:将变量的值与指定的数值按位与之后重新赋给该变量,x&=8,将变量x的值与8 按位与运算之后重新赋给变量x; 将变量的值与指定的数值按位或之后重新赋给该变量,x|=7将变量x的值与7执行按位或运算之后重新赋给变量x; 将变量的 值与指定的数值按位异或之后重新赋给该变量,x^=9,将变量x的值与9执行按 位异或运算之后重新赋给变量x。
示例:
[root@localhost ~]# var_a=4
[root@localhost ~]# ((var_a&=8))
[root@localhost ~]# echo $var_a
0
三、${}中的使用
1、${parameter}
说明:返回变量的内容
示例:
[root@localhost ~]# var_a=1
[root@localhost ~]# echo ${var_a}
1
2、${#parameter}
说明:返回变量内容的长度(按字符)
示例:
[root@localhost ~]# str="hello aword"
[root@localhost ~]# echo ${#str}
11
3、${paramater:offset}
说明:在变量${parameter}中,从位置offset之后开始提取子串到结 尾
示例:
[root@localhost ~]# str1="abcdef"
[root@localhost ~]# echo ${str1:2}
cdef
4、${paramater:offset:length}
说明:在变量${parameter}中,从位置offset之后开始提取长度为length的子串
示例:
[root@localhost ~]# str1="abcdef"
[root@localhost ~]# echo ${str1:2:1}
c
5、${parameter#word}
说明:从变量 ${parameter} 开头开始删除最短匹配的 word 子串
示例:
[root@localhost ~]# str1="abcdef"
[root@localhost ~]# echo ${str1#ac}
abcdef
[root@localhost ~]# echo ${str1#a}
bcdef
6、${parameter##word}
说明:从变量${parameter}开头开始删除最长匹配的word子串
示例:
[root@localhost ~]# echo ${str1##abc}
defabcabc
[root@localhost ~]# echo ${str1##bc}
abcdefabcabc
[root@localhost ~]# echo ${str1##abc}
defabcabc
7、${parameter%word}
说明:从变量 ${parameter} 结尾开始删除最短匹配的 word 子串
[root@localhost ~]# str1="abcdefabcabc"
[root@localhost ~]# echo ${str1%bc}
abcdefabca
[root@localhost ~]# echo ${str1%b}
abcdefabcabc
8、${parameter%%word}
说明:从变量 ${parameter} 结尾开始删除最长匹配的 word 子串
[root@localhost ~]# str1="abcdefabcabc"
[root@localhost ~]# echo ${str1%%b}
abcdefabcabc
[root@localhost ~]# echo ${str1%%cab}
abcdefabcabc
[root@localhost ~]# echo ${str1%%cabc}
abcdefab
9、${parameter/pattern/string}
说明:使用 string 代替第一个匹配的 pattern
[root@localhost ~]# str1="abcdefabcabc"
[root@localhost ~]# echo ${str1/abc/xx}
xxdefabcabc
10、${parameter//pattern/string}
说明:使用 string 代替所有匹配的 pattern
示例:
[root@localhost ~]# str1="abcdefabcabc"
[root@localhost ~]# echo ${str1//abc/xx}
xxdefxxxx
四、条件测试的语法
文件操作符
test示例:
[root@localhost test1]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 17 14:35 file
[root@localhost test1]# test -f file1;echo $?
1
[root@localhost test1]# test -f file;echo $?
0
[root@localhost test1]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 17 14:35 file
[root@localhost test1]# [ -f file1 ];echo $?
1
[root@localhost test1]# [ -f file ];echo $?
0
[root@localhost test1]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 17 14:35 file
[root@localhost test1]# [[ -f file ]];echo $?
0
[root@localhost test1]# [[ -f file1 ]];echo $?
1
实验1:通过read读入两个整数,并比较他们的大小
[root@localhost test1]# vim work_807.sh
#!/bin/bash
#########################
#File name:work_807.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-08-17 14:42:45
#Description:
#########################
#请输入两个整数num1和num2yy
read -p "Please input two number: " num1 num2
#如果输入的两个数字为空,提示重新输入来个整数,返回转态码为1
[ -z "$num1" -o -z "$num2" ] && {
echo "Please input two number: "
exit 1
}
#输入的是否为数字,标准输入到/dev/null,并且把返回结果给return_num1,
expr $num1 + 10 &> /dev/null
return_num1=$?
expr $num2 + 10 &> /dev/null
return_num2=$?
#如果return_a和return_b哟一个不为0,代表输入错误,需要重新输入,返回转态码为2
[ "$return_num1" -eq 0 -a "$return_num2" -eq 0 ] || {
echo "Please input two number: "
echo 2
}
#判断num1是否小于num2
[ "$num1" -lt "$num2" ] && {
echo "$num1 < $num2"
exit 0
}
#判断num1是否等于num2
[ "$num1" -eq "$num2" ] && {
echo "$num1 = $num2"
exit 0
}
#判断num1是否大于num2
[ "$num1" -gt "$num2" ] && {
echo "$num1 > $num2"
exit 0
}
[root@localhost test1]# bash work_807.sh
Please input two number: 2 2
2 = 2
[root@localhost test1]# bash work_807.sh
Please input two number: 3 5
3 < 5
实验2:假设执行一个可以携带参数的script,执行该脚本后屏幕会显示如下的数据:
[root@localhost test1]# cat work2.sh
#!/bin/bash
#########################
#File name:work2.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-08-17 15:13:57
#Description:
#########################
#输出程序名
echo "the script name is $0"
#输出所有参数
echo "the parameter number is $#"
#判断参数是否小于2个
[ "$#" -lt 2 ] && echo "the number of parameter is less than 2." && exit 0
[root@localhost test1]# bash work2.sh 2 3
the script name is work2.sh
the parameter number is 2
[root@localhost test1]# bash work2.sh 2
the script name is work2.sh
the parameter number is 1
the number of parameter is less than 2.