shell编程进阶

这篇博客深入探讨了Shell编程的各种循环结构,包括for、while、until循环,并提供了详细的实例,如判断文件类型、创建用户等。此外,还介绍了无限循环、continue和break的使用,以及select循环和函数的应用。博客中详细讲解了如何在Shell脚本中定义和调用函数,展示了函数的生命周期和一些实用例子。最后,博主提到了一些其他脚本工具,如mktemp、install和expect,并讨论了数组和字符串处理在Shell编程中的应用。
摘要由CSDN通过智能技术生成

循环

常见的循环的命令:for, while, until
格式一:
for 变量名 in 列表;do
循环体
done
格式二:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
范例:
1 打印99乘法表

[root@centos8|8|scripts]#bash 99.sh 
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	
1*10=10	2*10=20	3*10=30	4*10=40	5*10=50	6*10=60	7*10=70	8*10=80	9*10=90	10*10=100	
[root@centos8|9|scripts]#cat 99.sh 
#/bin/bash

for i in {
   1..10} ;do
	for j in `seq $i`;do
		echo -e "${j}*${i}=$[i*j]\t\c"
	done
	echo
done
[root@centos8|11|scripts]#bash 992.sh 
1x1=1	
2x1=2	2x2=4	
3x1=3	3x2=6	3x3=9	
4x1=4	4x2=8	4x3=12	4x4=16	
5x1=5	5x2=10	5x3=15	5x4=20	5x5=25	
6x1=6	6x2=12	6x3=18	6x4=24	6x5=30	6x6=36	
7x1=7	7x2=14	7x3=21	7x4=28	7x5=35	7x6=42	7x7=49	
8x1=8	8x2=16	8x3=24	8x4=32	8x5=40	8x6=48	8x7=56	8x8=64	
9x1=9	9x2=18	9x3=27	9x4=36	9x5=45	9x6=54	9x7=63	9x8=72	9x9=81	
[root@centos8|12|scripts]#cat 992.sh
#/bin/bash
for ((i=1;i<=9;i++));do
	for((j=1;j<=i;j++));do
		echo -e "${i}x${j}=$[i*j]\t\c"
	done
		echo 
done

2 把data/test下的文件改为以bak结尾

[root@centos8|45|test]#ls
10.log  1.log  2.log  3.log  4.log  5.log  6.log  7.log  8.log  9.log
10.mp   1.mp   2.mp   3.mp   4.mp   5.mp   6.mp   7.mp   8.mp   9.mp
10.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
[root@centos8|50|scripts]#bash for_rename.bak 
[root@centos8|52|scripts]#ls /data/test/
10.bak  1.bak  2.bak  3.bak  4.bak  5.bak  6.bak  7.bak  8.bak  9.bak
[root@centos8|53|scripts]#cat for_rename.bak 
#/bin/bash
DIR=/data/test
cd $DIR
	for FILE in *;do
	PRE=`echo $FILE |sed -nr 's/(.*)\.([^.]+)$/\1/p' `
	mv $FILE $PRE.bak
done

3 要求将目录YYYY-MM-DD/中所有文件,移动到YYYY-MM/DD/下


#1 yyyy-mm-dd10.sh 创建YYYY-MM-DD,当前日期一年前365天到目前共365个目录,里面有10个文
件,$RANDOM.log
[root@centos8|82|data]#cat scripts/YYMMDD.sh 
#bin/bash
for i in {
   1..365};do
	DIR=`date -d "-$i day" +%F`
	mkdir $DIR
	cd $DIR
for n in {
   1..10};do
	touch $RANDOM.log
done
	cd ..
done
2 移动到YYYY-MM/DD/下
[root@centos8|91|data]#cat 123.sh 
#bin/bash
DIR=/data
cd $DIR
for DIR2 in * ;do
	PDIR=`echo $DIR2 | cut -d"-" -f1,2`
	SUBDIR=`echo $DIR2 | cut -d"-" -f3`
	[ -d $PDIR/$SUBDIR ] || mkdir -p $PDIR/$SUBDIR $> /dev/null
	mv $DIR2/*  $PDIR/$SUBDIR
done

```bash
[root@centos8|97|data]#bash 111.sh
5050
[root@centos8|98|data]#cat 111.sh 
#/bin/bash
sum=0
for ((i=1;i<=100;i++));
do
	let sum+=i
done
echo $sum

判断/var/目录下所有文件的类型

[root@centos8|108|data]#cat 333.sh
#/bin/bash
cd /var
for FILE in * ;
do
	if [ -f $FILE ];
	then 
		echo "$FILE 是普通文件";
	elif [ -d $FILE ];
	then
		echo "$FILE 是目录文件";
	elif [ -h $FILE ];
	then
	        echo "$FILE 是链接文件";
	else 
		echo "为其他文件";
	fi
done

2、添加10个用户user1-user10,密码为8位随机字符

[root@centos8|116|data]#cat user.sh
#bin/bash



USER=`echo user{
    1..10}`
for NAME in $USER ;do
	useradd $NAME
	PASS=`cat /dev/urandom | tr -dc '[[:alnum:]]' | head -c8`
	echo $PASS | passwd --stdin &> /dev/null
	passwd -e $NAME &> /dev/null
	echo $NAME:$PASS >> /root/user.txt
	echo $NAME 已经创建好
done

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

[root@centos8|133|data]#cat 44.sh
#/bin/bash


cd /etc/rc.d/rc3.d
for FILE  in * ;
do
    [[ "$FILE" =~ ^K. ]]&& echo "$FILE stop"
    [[ "$FILE" =~ ^S. ]]&& echo "$FILE start"
done

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

[root@centos8|145|data]#cat 6.sh
#/bin/bash

read -p "请输入一个数字" NUM
sum=0
NUMBER=`seq $NUM`
for i in $NUMBER ;do
	let sum+=$i;

done
echo $sum

5、计算100以内所有能被3整除的整数之和

[root@centos8|148|data]#bash 2.sh
1683
[root@centos8|149|data]#cat 2.sh
#/bin/bash
sum=0
for i in {
   3..100..3};do
	let sum+=$i
done
echo $sum

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

[root@centos8|158|data]#bash 4.sh
请输入一个ip地址www.baidu.com
在线
[root@centos8|159|data]#cat 4.sh
#/bin/bash
read -p "请输入一个ip地址" IP
ping -c1 -W1 $IP &> /dev/null && echo "在线" || echo "不在线" 

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:
1AbCdeFgH.html

[root@centos8|166|data]#bash 8.sh 
文件已经创建好
[root@centos8|167|data]#ls /testdir/
10.html  1.html  2.html  3.html  4.html  5.html  6.html  7.html  8.html  9.html
[root@centos8|168|data]#cat 8.sh 
#/bin/bash
cd /testdir
RAM=`cat /dev/urandom | tr -dc [[:alpha:]] | head -c8`
for (( i=1;i<=10;i++ ));do
	touch ${i}${RAN}.html
done
echo "文件已经创建好"

9、打印等腰三角形

[root@centos8|211|data]#bash 232.sh 
        *
       ***
      *****
     *******
    *********
   ***********
  *************
 ***************
*****************
[root@centos8|212|data]#cat 232.sh
#!/bin/bash

for ((i=1;i<=9;i++))
do
	for((j=9;j>i;j--))
do
	echo -n " "
done
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值