目录
一、for循环
1.1 语法一
for 变量 in 值1 值2
do
循环执行的语句
done
for i in `cat test.txt` # 默认以空白为分割符
do
echo $i
done
1.2 语法二
for ((初始化变量; 结束循环的条件; 运算))
do
循环执行的语句
done
for ((i=0; i<3; i++))
do
echo $i
done
1.2.1 seq
[root@nginx-kafka01 ~]# seq 5
1
2
3
4
5
[root@nginx-kafka01 ~]# seq 2 5
2
3
4
5
[root@localhost shell-test]# seq 5 2 10 #从5开始到10结束,步长为2
5
7
9
1.2.2 for循环数字
#第一种
for ((i=0; i<3; i++))
do
echo $i
done
#第二种
for i in `seq 1 2 20`
do
echo $i
done
#第三种
for i in {1..10}
do
echo $i
done
二、read
接受用户的标准输入
-p 指定提示语
[root@localhost shell-test]# read a b c
xx yy
[root@localhost shell-test]# echo $a
xx
[root@localhost shell-test]# echo $b
yy
[root@localhost shell-test]# echo $c
[root@localhost shell-test]# read a b c
xx yy zz fff
[root@localhost shell-test]# echo $a
xx
[root@localhost shell-test]# echo $b
yy
[root@localhost shell-test]# echo $c
zz fff
2.1 结合while循环
[root@nginx-kafka01 lianxi]# cat test.sh
#!/bin/bash
# 方法二
cat test.txt | while read a b
do
echo "a is $a,b is $b"
done
# 方法二
while read line
do
echo "这一行为"$line
done < test.txt
[root@nginx-kafka01 lianxi]# bash test.sh
hello world
a is hello,b is world
这一行为hello world
[root@nginx-kafka01 lianxi]# bash test.sh
hello world
a is hello,b is world
这一行为hello world
2.2.1 练习
有一个fuwu.txt文本,文本内容如下
IP AREA QUFU
192.168.0.1 HUNAN 2 89 60
192.168.1.1 HUNAN 3
192.168.3.1 HUBEI 4 9 10
192.168.4.1 HAINAN 56 34
192.168.5.1 HUHUA 8
输出每一个HUNAN地区的ip和qufu的映射关系
192.168.0.1的区服为:2
192.168.0.1的区服为:89
192.168.0.1的区服为:60
192.168.1.1的区服为:3
【答案1】
#!/bin/bash
while read IP AREA QUFU
do
for i in $QUFU
do
if [ $AREA == 'HUNAN' ]
then
echo "${IP}的区服为${i}"
fi
done
done < fuwu.txt
【答案2】
三、if条件判断
f 条件
then
执行语句
else
执行语句
fi
if [ command ];then
符合该条件所要执行的语句
elif [ command ];rhen
符合该条件所要执行的语句
fi
[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格。
#后面可以直接接命令
if id sc &> /dev/null
then
echo "sc已存在"
else
echo "sc不存在"
fi
3.1 常用判断
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
if [ -f test.txt ]
then
echo "文件已存在"
else
echo "文件不存在"
fi
3.1.1 [] 和[[]]的区别
[root@localhost shell-test]# [ $name == "sc tl" ] #一个中括号遇到空白会进行分词,比如此处,会将空白前后识别为两个字符串
-bash: [: 参数太多
[root@localhost shell-test]# [[ $name == "sc tl" ]] #引号内的字符串会识别为一个整体
[root@localhost shell-test]# echo $?
0
所以推荐使用双中括号[[]]
3.2 字符串判断
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。(字典:新华字典,即字母)(小写在前,大写在后)
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
[root@localhost shell-test]# [ 'abc' == 'cda' ]
[root@localhost shell-test]# echo $?
1
[root@localhost shell-test]# [[ 'abc' == 'cda' ]] #两个中括号也可以
[root@localhost shell-test]# echo $?
1
[root@localhost shell-test]# [ 'a' > 'A' ]
[root@localhost shell-test]# echo $?
0
3.3 数值判断
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,
[root@localhost shell-test]# [[ 123 > 22 ]]
[root@localhost shell-test]# echo $?
1
[root@localhost shell-test]# [[ 123 -gt 22 ]]
[root@localhost shell-test]# echo $?
0
#只能进行整数运算
[root@localhost shell-test]# [ 123 > 22 ]
[root@localhost shell-test]# echo $?
0
[root@localhost shell-test]# (( 123 > 22 ))
[root@localhost shell-test]# echo $?
0
3.3.1 bc
既可以进行整数运算,也可以进行小数运算
[root@localhost shell-test]# echo "6<3"|bc
0
[root@localhost shell-test]# echo "6.5<3.2"|bc
0
[root@localhost shell-test]# echo "6.5>3.2"|bc
1
3.4 逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
类似python的逻辑短路运算
使用&& || 来实现
cmd1 && cmd2 如果cmd1执行成功,或者为真,则执行cmd2
cmd1 || cmd2 如果cmd1执行不成功,或者为假,则执行cmd2
cmd1 && cmd2 || cmd3 如果cmd执行成功,就执行cmd2,不成功就执行cmd3
四、数值运算
4.1 整型数值运算
- $(( 表达式 ))
- $ [ 表达式 ]
- expr 表达式
- let
[root@192 ~]# a=10
[root@192 ~]# b=20
[root@192 ~]# echo $(( $a + $b ))
30
[root@192 ~]# echo $[ $a + $b ]
30
[root@192 ~]# expr $a + $b
30
[root@192 ~]# expr $a+$b
10+20
[root@192 ~]# let a=1+2
[root@192 ~]# echo $a
3
4.2 浮点型
使用 bc
五、case语句
case $变量 in
value1)
语句体
;;
value2)
语句体
;;
*)
语句体
;;
esac
自主选择加减乘除功能
#!/bin/bash
while true
do
read -p '请输入要操作的两个数字:' num1 num2
echo ''1.加法''
echo ''2.减法''
echo ''3.乘法''
echo ''4.除法''
echo ''q.退出''
read -p '请输入要进行的操作:' option
case $option in
1)
echo ''两数之和为:$(($num1+$num2))''
;;
2)
echo ''两数之差为:$(($num1-$num2))''
;;
3)
echo ''两数之积为:$(($num1*$num2))''
;;
4)
echo ''两数之除为:$(($num1/$num2))''
;;
q)
break
;;
*)
echo ""输入错误,请重新输入""
esac
done
六、数组
定义: 使用圆括号,中间以 空格作为分隔符
[root@mysql-binary shell_test]# a=(xx yy zz ff)
[root@mysql-binary shell_test]# echo $a
xx
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz ff
[root@mysql-binary shell_test]# echo ${a[@]}
xx yy zz ff
[root@mysql-binary shell_test]# echo ${a:0:4}
xx
[root@mysql-binary shell_test]# echo ${a[*]:1:3}
yy zz ff
[root@mysql-binary shell_test]# echo ${#a[*]}
4
[root@mysql-binary shell_test]# echo ${#a[@]}
4
[root@mysql-binary shell_test]# a[3]="hh"
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz hh
[root@mysql-binary shell_test]# unset a[3]
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz
[root@mysql-binary shell_test]# unset a[1]
[root@mysql-binary shell_test]# echo ${a[*]}
xx zz
[root@mysql-binary shell_test]# unset a[1]
[root@mysql-binary shell_test]# echo ${a[*]}
xx zz
# 删除数组元素后,下标不会改变,相当于移除的地方变为空
[root@mysql-binary shell_test]# echo ${!a[*]} #查看下标
0 2
[root@mysql-binary shell_test]# unset a[2]
[root@mysql-binary shell_test]# echo ${a[*]}
xx
七、随机数
$RANDOM
范围:0-32767
产生10以内的随机数:echo $((RANDOM %10))
产生150-200随机数:echo $((RANDOM % 50 +150 ))
#!/bin/bash
# 儿童弹珠:随机生成12个灯,1为亮,0为灭,选中灯亮的则赢
a=()
for i in `seq 12`
do
a[$(($i-1))]=$(($RANDOM % 2))
done
echo ${!a[*]}
n=3
while (( $n > 0 ))
do
read -p ''您还有$n次机会,请输入您猜测的灯号(0-11):'' option
n=$(( $n-1 ))
if (( a[$option]==1 ))
then
echo '恭喜您答对了'
break
else
echo '答错了~'
fi
done
echo ''本轮灯的情况为:${a[*]}''