【Linux】(22)shell编程常用知识

本文详细介绍了Shell脚本中的for循环语法,包括seq、数字循环,以及read命令的使用,如结合while循环读取文件。接着讲解了if条件判断,包括常见判断、字符串和数值判断,并提到了bc命令进行浮点运算。文章还涵盖了逻辑运算、数值运算、case语句、数组操作和随机数生成。通过实例展示了如何处理文本数据和执行条件判断操作。
摘要由CSDN通过智能技术生成

目录

一、for循环

        1.1 语法一

        1.2 语法二

        1.2.1 seq

        1.2.2 for循环数字

二、read

        2.1 结合while循环

        2.2.1 练习

 三、if条件判断

        3.1 常用判断

        3.1.1 [] 和[[]]的区别

        3.2 字符串判断

        3.3 数值判断

        3.3.1 bc

        3.4 逻辑判断

四、数值运算

        4.1 整型数值运算

        4.2 浮点型

五、case语句

六、数组

七、随机数


一、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 整型数值运算

  1. $(( 表达式 ))
  2. $ [ 表达式 ]
  3. expr 表达式
  4. 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[*]}''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值