【LinuxShell】Shell编程之扩展知识

1.变量值的调换

//定义两个变量
a=10
b=20
//将变量a、变量b数值进行调换
c=$a
a=$b
b=$c

2.if语句

if 语句
if [ 表达式 ]
if test 表达式
if 命令

  if语句做判断实际上就是看后面的表达式或者命令的状态码。状态码为0时成立就执行do后面的命令,状态码为1时不成立就执行else语句。

  if语句也可以不另换行输出,直接跟着if后面,表现形式如下

if [ 表达式 ];then 代码块1; 代码块2; fi

3.case语句

case 变量值($变量) in
模式1)
  代码块1
;;
模式2)
  代码块2
;;
*)
  代码块3
;;
esac

  case语句中的模式表达式可以为字符串,也可以为通配符。其中通配符表现形式如下:

9[0-9])							#90-99区间的模式
     ...
[6-8][0-9])                     #60-89区间的模式,其中[6-8]也可以写为[678]
     ...
[0-9]|[1-5][0-9]                #0-59区间的模式,|前面的表示0-9区间,|表示或,|后面的表示10-59区间
     ...

4.退出循环

  • break:默认用于退出单层循环
  • continue:用于终止某次循环的执行continue之后的代码块
  • exit:退出当前脚本的执行,还可以定义返回状态码

5.获取字符串的用法

awk命令获取字符串

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3770         606        2765          20         399        2911
Swap:          5721           0        5721
[root@localhost ~]# free -m | grep Mem | awk '{print $3}'
606

  如果想要获取ip地址中某一段的值,具体操作如下:

[root@localhost ~]# echo '192.168.145.10' | awk -F. '{print $3}'  #由于awk默认只能分隔空格,如果想要指定分隔符用-F
145

echo命令获取字符串

[root@localhost ~]# i='192.168.145.10'
[root@localhost ~]# echo ${i:0:3}
192

  其中echo命令还可以通过删除其余字段来获取想要的字段:

[root@localhost ~]# i='192.168.145.10'
[root@localhost ~]# echo ${i%%.*}      #获取i的值,然后从后往前删,一直删到最后一个点
192
[root@localhost ~]# echo ${i%.*}      #获取i的值,然后从后往前删,一直删到第一一个点
192.168.145
[root@localhost ~]# echo ${i##*.}      #获取i的值,然后从前往后前删,一直删到最后一个点
10
[root@localhost ~]# echo ${i#*.}      #获取i的值,然后从后往前删,一直删到第一一个点
168.145.10

6.逐行读取

for命令获取逐行读取

[ root@localhost ~]# for a in $(cat abc.txt)
> do
> echo $a
> done
11
22
33
44
55
66
77
88
99

whie read 获取逐行读取

[root@localhost ~]# while read b
> do
> echo $b
> done < abc.txt
11
22
33
44
55
66
77
88
99

7.例题

猴子摘下了n个香蕉,当天吃掉一半多一个,第二天也是吃掉剩下香蕉一半多一个,到了第十天,香蕉只剩下了1个。问:猴子第一天摘了多少香蕉?

[root@localhost ~]# vim banana.sh 
#!/bin/bash
n=1
for((i=9;i>0;i--))
do
   n=$[(n+1)*2]
done
echo "猴子第一天摘了${n}根香蕉" 
[root@localhost ~]# bash banana.sh 
猴子第一天摘了3070根香蕉

求斐波拉切数前10位以及前10位的总和(斐波拉切数:从数列开始,第三个数等于前两个数之和)

[root@localhost ~]# vim sum.sh 
#!/bin/bash
n=1
m=1
sum=0
for((i=1;i<=10;i++))
do
  echo -ne "$n\t"
  j=$[m+n]
  let sum+=$n
  n=$m
  m=$j
done
echo "前10个数总和为$sum"
[root@localhost ~]# bash sum.sh 
1	1	2	3	5	8	13	21	34	55	
前10个数总和为143

字符切片与随机生成密码的应用

[root@localhost ~]# a='1234567890'
[root@localhost ~]# echo $a
1234567890
[root@localhost ~]# echo ${a}
1234567890
[root@localhost ~]# echo ${#a}			  #字符串长度
10
[root@localhost ~]# echo ${a:3:3}		  #第一个a表示想要获取的字符串;第二个3表示坐标,坐标从0开始;第三个3表示想要获取字符串的长度为3个数
456
[root@localhost ~]# echo $[RANDOM % ${#a}] #随机生成10以内的数作为下标值
7
[root@localhost ~]# echo $[RANDOM % ${#a}] 
4
[root@localhost ~]# tmp=$[RANDOM % ${#a}] 
[root@localhost ~]# echo ${a:tmp:1}        #随机生成10以内的数
2
[root@localhost ~]# num=2
[root@localhost ~]# b=6
[root@localhost ~]# num=$num$b             #字符串的追加
[root@localhost ~]# echo $num
25
[root@localhost ~]# b=7
[root@localhost ~]# num=$num$b
[root@localhost ~]# echo $num
257
[root@localhost ~]# vim passwd.sh
#!/bin/bash
str='1234567890'
for((i=1;i<=8;i++))
do
    a=$[RANDOM % ${#str}]
    tmp=${str:a:1}
     passwd=$passwd$tmp
done
echo "随机生成一个密码为:${passwd}"
[root@localhost ~]# bash passwd.sh 
随机生成一个密码为:22869930
[root@localhost ~]# bash passwd.sh 
随机生成一个密码为:71619535
[root@localhost ~]# bash passwd.sh 
随机生成一个密码为:06064462

求0~255之间的数字(余数倒排法)

[root@localhost ~]# vim ip.sh
#!/bin/bash
read -p "请输入0-255之间的数字:" num
for((i=1;i<=8;i++))
do
    a=$[num % 2]$a					#通过取余从后向前赋值 					
    let num=$[num / 2]
done
echo $a
[root@localhost ~]# bash ip.sh
请输入0-255之间的数字:192
11000000

求0~255之间的数字(减法正排法)

[root@localhost ~]# vim ip.sh
#!/bin/bash
read -p "请输入0-255之间的数字:" num
for i in {128,64,32,16,8,4,2,1}
do
    a=$[num-i]        
    if [ $a -lt 0 ]     #判断各个位数是否能被i的取值列表减
    then
        echo -n 0
    else
        echo -n 1
        let num-=i
    fi
done
echo ''
[root@localhost ~]# bash ip.sh
请输入0-255之间的数字:192
11000000

分隔文件每20行输出

[root@localhost ~]# vim test.sh
#!/bin/bash
#定义记录行数的变量
a=0
#定义分割的文件序号标识
b=1

IFS_OLD=$IFS				#先将IFS赋给IFS_OLD,作为临时修改IFS的值
IFS=$'\n'					#然后修改IFS的值为换行符
for i in $(cat anaconda-ks .cfg)
do 
	let a++                 #记录行数
	c=$[a % 20]             #每20行一分割,当余数不为零就不足20行
	if [ $c -eq 0 ];then    #判断当余数是否为零,为0就正好20行,不为0就不足20行
	   echo $i >> ks.cfg-$b #如果满20行,则分隔文件
	   let b++
	 else 
	    echo $i >> ks.cfg-$b
	 fi
done
IFS=$IFS_OLD                #再将IFS赋值回初始值,防止其他脚本文件出错
[root@localhost ~]#bash test.sh
ks.cfg-1  ks.cfg-2  ks.cfg-3 ks.cfg-4

  其中for循环分隔会包含空格、换行符和制表符,如果一行字符串有多个空格间隔,则分割时会视为多行输出。如果只想修改当前脚本只以换行符作为分割,可以修改IFS

[root@localhost ~]# set | grep IFS
IFS=$' \t\n'
    local i IFS='
    local i IFS=" "'
    local i IFS=" "'
    local i IFS='
    local i IFS='
            local c i=0 IFS=' 	
    local IFS='
    local IFS='
    local option option2 i IFS=' 	
    IFS=' 	
        local IFS='
        local IFS='
        local IFS='
        local IFS='
    local IFS='
        local IFS='
    local i IFS='
    local IFS='
            local i c='' IFS='
        local OIFS=$IFS IFS='
        IFS=$OIFS;
                local IFS='
                    local IFS='
                    local IFS='
    local IFS='
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值