shell脚本基础

本文深入探讨了Shell脚本中的循环语句(for、while、until)与函数的使用方法,包括结构、实例及数组操作,适用于系统管理和自动化任务。

循环语句

for循环语句

for语句结构
读取不同的变量值,用来逐个执行同一组命令

语句结构
for 变量名 in 取值列表
do
	命令序列
done

在这里插入图片描述

例如
批量添加用户
用户名存放在users.txt文件中,每行一个
初始密码均设为123456

[root@localhost opt]# vim user.txt
zhangsan
lisi
wangermazi
zhaoliu
tianji
wangba
vim user.txt

#!/bin/bash
list=$(cat /opt/user.txt)
for v in $list
  do
     useradd $v
     echo "123456" | passwd --stdin $v
     echo "创建用户${v}成功"
  done

根据IP地址检查主机状态
检测IP地址192.168.197.0-192.168.197.10段落
使用ping命令检测各主机的连通性

[root@localhost opt]# vim ip.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
  ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
  if [ $? -eq 0 ]
        then
        echo "Host 192.168.197.$i is up"
  else
        echo "Host 192.168.197.$i is down"
  fi
done

shell中let命令
let 对整数进行数学运算
let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))

#!/bin/bash
for ((i=1;i<=10;i++));do
echo $i
done

#!/bin/bash
for ((i=1;i<=100;i+=2));do
 let sum+=$i
done
echo "$sum"

while循环语句

while语句结构
重复测试某个条件,只要条件成立则反复执行

语句结构
while 条件测试操作
do
命令序列
done

在这里插入图片描述

#!/bin/bash
i=1
while [ $i -le 100 ]
do
 if [ ! `expr $i % 3` -eq 0 ];then
 echo $i
 fi
 let i++
done

九九乘法表

#!/bin/bash
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
  sum=$[$i*$j]
  echo -n "$i*$j=$sum "
  done
echo
done

等腰三角形

#!/bin/bash
for ((i=1;i<=5;i++))
do
        for ((k=5;k>=i;k--))
        do
        echo -n " " 
        done

        for ((j=1;j<=2*i-1;j++))
        do
        echo -n "*"
        done
echo ""
done

until语句结构

重复测试某个条件,只要条件不成立则反复执行
until 条件测试操作
do
命令序列
done

在这里插入图片描述

为指定用户发送在线消息
若用户不在线(未登录系统),则每5s试一次,直至用户登录系统后再发送信息,用户名与消息通过位置参数传递给脚本
1.位置参数个数大于
2.姓名属于系统用户 /etc/passwd
3.是否在线 until who
4.发送信息 echo “ ” | write 用户名

#!/bin/bash
username=$1
if [ $# -lt 1 ];then
echo "Usage : 'basename $0'  <username> [<message>]"
        exit 1
fi
if grep "$username" /etc/passwd > /dev/null;then :
else
        echo “not user”
        exit 2
fi
until who |grep "$username"  > /dev/null;do
        echo “user not login”
        sleep 5
done
~        

猜价格游戏

#!/bin/bash
num=$[RANDOM%101]
i=0
while true
do
let i++
read -p "请输入您猜测的价格(0-100)" a
if [ $a -eq $num ];then
echo "恭喜你猜对了"
break
elif [ $a -lt $num ];then
echo "低了"
else
echo "高了"
fi
done
echo "你一共猜了${i}次"

shell函数
将命令序列按格式写在一起
可方便重复使用命令序列

shell函数定义
[ function ] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}

return返回的是状态码,需要使用$?调取

echo 返回的是值,使用变量调用

传参:指位置变量

可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

调用函数的方法
函数名 [参数1] [参数2]

递归函数

调用自己本身的函数

递归遍历目录

#!/bin/bash
function list_files(){
   for f in `ls $1`
   do
    #判断是否为目录
    if [ -d "$1/$f" ];then
       echo "$2$f"
       #递归调用
       list_files "$1/$f"  " $2"
    else
       echo "$2$f"
    fi
   done
}
list_files "/var/log" ""
[root@localhost opt]# sh files.sh 
anaconda
 anaconda.log
 ifcfg.log
 journal.log
 ks-script-E3s5jr.log
 packaging.log
 program.log
 storage.log
 syslog
 X.log
audit
 ...

shell数组

获取元素长度

遍历元素

元素切片

元素替换

元素删除

…

注意,忌讳数组越界,

数组下标从0开始算

数组长度从1开始算

shell中数组是可变长的
数组定义方法

方法一:

基本格式

数组名=(value0 value1 value2…)

方法二:

基本格式

数组名=([0]=value [1]=value [2]=value…)

方法三:数组元素之间使用空格隔开

基本格式

列表名=“value0 value1 value2” 数组名=($列表名)

方法四:(多用于替换)

基本格式

数组名[0]=“value”

数组名[1]=“value”

数组名[2]=“value” …


根据用户需求自定义数组

[root@localname opt]# vim ceshi.sh 
#!/bin/bash
i=0
while true
do
read -p "是否存入元素(yes/no)" a
if [ $a == "no" ]
then
break
fi
read -p "请输入第$[$i+1]个元素:" b
num[$i]=$b
let i++
done
echo "${num[*]}"

在这里插入图片描述

把数组中小于60的数替换成60

#!/bin/bash
num=(72 62 52 42 32 22 12 75 85 95)
i=1
for v in ${num[*]}
do
  if [ $v -lt 60 ]
  then
  new[$i]=60
  else
  new[$i]=${num[$i]}
  fi
let i++
done
echo "${new[*]}"

在这里插入图片描述

数组排序(冒泡排序)

#!/bin/bash
num=(72 62 52 42 32 22 12 75 85 95)
tmp=0
for ((i=1;i<${#num[*]};i++))
do
  for ((j=0;j<${#num[*]}-i;j++))
  do
        if [ ${num[$j]} -gt ${num[(($j+1))]} ];then
        tmp=${num[$j]}
        num[$j]=${num[(($j+1))]}
        num[(($j+1))]=$tmp
  fi
  done
done
echo ${num[*]}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值