使用if选择结构
if [];then
elif [];then #注意这个地方,java是else if
else ;
fi
使用for循环结构
使用for循环,语法结构如下所示: for 变量名 in 值1 值2 值3 #值的数量决定循环任务的次数 do 命令序列 done
ini
#循环输出1到10
for i in {1..10} #注意的是花括号里面不加空格
do
echo $i;
done
ini
#从文件中获取数据,进行批量的ping,或者用户创建
# 创建存储信息的文件,也是数据来源
vim /sh/ip.txt
192.168.88.2
192.168.88.254
192.168.88.3
192.168.88.240
#使用$(cat 路径)获取数据
for i in $( cat /sh/ip.txt )
do
ping -c 1 $i &> /dev/null;
if [ $? == 1 ];then
echo $i"可以ping通";
else echo $i"bu可以ping通";
fi
done
使用while循环结构
写法 | 特点 | 适用场景 |
---|---|---|
while : |
简洁,无限循环,需手动退出。 | 简单守护进程、持续监控 |
while true |
功能相同,但语义更明确(推荐)。 | 同 while : |
while [条件] |
条件满足时循环,可自动终止。 | 需要动态终止条件的场景 |
使用while循环,语法结构如下所示:
while 条件测试 #根据条件的结果决定是否要执行任务,条件测试成功的话就执行,如果失败立刻结束循环
do
命令序列
done
ini
num=$[RANDOM%10+1] 是一种生成 1 到 10 之间的随机整数 的方法。
num=$[RANDOM%12+1]
q=1
while [ $q -eq 1 ];
do
read -p "shuru[1-12]:" nub;
if [ $nub -gt $num ];then
echo "pianda";
elif [ $num -gt $nub ];then
echo "pianxiao";
else echo "daduil";q=0;
fi
done
注意:使用[]一定要记得使用空格
中断及退出
关键字 | 作用范围 | 功能描述 | 典型场景 | 示例代码 |
---|---|---|---|---|
break |
循环结构(for /while /until ) |
立即退出当前循环,后续迭代不再执行。 | 提前终止循环(如找到目标后退出)。 | bash<br>for i in {1..5}; do<br> [ "$i" -eq 3 ] && break<br> echo "$i"<br>done<br># 输出: 1 2<br> |
continue |
循环结构(for /while /until ) |
跳过当前迭代,直接进入下一次循环。 | 跳过特定条件下的处理(如忽略无效输入)。 | bash<br>for i in {1..5}; do<br> [ "$i" -eq 3 ] && continue<br> echo "$i"<br>done<br># 输出: 1 2 4 5<br> |
exit |
整个脚本或函数 | 立即终止脚本或函数 ,并返回退出状态码(默认 0 ,非零表示错误)。 |
发生致命错误时终止脚本,或从函数返回状态码。 | bash<br>if [ ! -f "file.txt" ]; then<br> echo "文件不存在"<br> exit 1<br>fi<br># 若文件不存在,脚本终止并返回状态码 1<br> |
ini
# 编写持续创建用户脚本sum.sh
q=0;
while :
do
read -p "请输入用户名,输入0退出:" usern;
if [ $usern == 0 ];then
break; #break跳出循环,exit结束正在执行的进程
elif useradd "$usern";then
q=$(($q+1));
continue;
else break;
fi
done
echo $q;
工具 | 语法格式 | 四则运算示例 | 求模运算示例 | 适用场景 | POSIX 兼容性 | 推荐度 |
---|---|---|---|---|---|---|
$(( )) |
$((表达式)) |
echo $((a + b)) echo $((a * b)) |
echo $((a % b)) |
通用算术运算(推荐),支持所有标准运算符(+ , - , * , / , % 等)。 |
✅ 完全兼容 | ⭐⭐⭐⭐⭐ |
$[ ] |
$[表达式] |
echo $[a + b] echo $[a * b] |
echo $[a % b] |
旧版 Bash 语法(已过时),功能与 $(( )) 相同,但非 POSIX 标准。 |
❌ 不兼容(部分 Shell 不支持) | ❌ 不推荐 |
let |
let "表达式" |
let "result=a+b" let "result=a*b" |
let "result=a%b" |
变量赋值或复杂运算(如 i++ ),但无法直接输出结果,需结合 echo 或变量。 |
✅ 完全兼容 | ⭐⭐⭐ |
基于case分支编写脚本
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。
case分支的语法结构如下所示:
case 变量 in
模式1)
命令序列1 ;;
模式2)
命令序列2 ;;
.. ..
*)
默认命令序列
esac
bash
case $1 in
-f)
touch $2;;
-d)
mkdir $2;;
-r)
remove -f $2;;
*)
echo "-d,-f,-r";
esac
使用Shell函数
在Shell脚本中,将一些需重复使用的操作,定义为公共的语句块,即可称为函数。通过使用函数,可以使脚本代码更加简洁,增强易读性,提高Shell脚本的执行效率 1)函数的定义方法 格式1: function 函数名 { 命令序列 .. .. } 格式2: 函数名() { 命令序列 .. .. } 2)函数的调用 直接使用"函数名"的形式调用,如果该函数能够处理位置参数,则可以使用"函数名 参数1 参数2 .. .."的形式调用。 注意:函数的定义语句必须出现在调用之前,否则无法执行。 3) 测试语法格式 [root@sv7 ~]# a() { #定义函数 echo abc echo xyz } [root@sv7 ~]# a #调用函数
字符串处理
bash
字符串截取的用法: ${变量名:起始位置:长度}
起始位置从0开始计数
[root@nsd ~]# echo ${phone:0:3}
121
字符串替换的两种用法:
1、只替换第一个匹配结果:${变量名/old/new}
2、替换全部匹配结果:${变量名//old/new}
[root@nsd ~]# echo ${phone/2/*}
1*12121212121
[root@nsd ~]# echo ${phone//2/*}
1*1*1*1*1*1*1
[root@nsd ~]# echo $phone ==注:替换数据不会改变原始数据的值==
1212121212121
字符串掐头去尾:
1、从左向右,最短匹配删除:${变量名#*关键词}
2、从左向右,最长匹配删除:${变量名##*关键词}
3、从右向左,最短匹配删除:${变量名%关键词*}
3、从右向左,最长匹配删除:${变量名%%关键词*}
[root@nsd ~]# echo ${n##* }
/mnt/dvd
[root@nsd ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.5G 0 rom /mnt/dvd
字符串初值的处理
可以通过${var:-初值}判断变量是否存在,决定变量的初始值。
bash
# 编写一个脚本可以创建用户,密码可以自定义也可以使用默认值123456
read -p "user:" usert
useradd $usert
read -p "password:" pas
echo ${pas:-123} | passwd --stdin $usert
cut
示例:截取以空格分隔的字符串的第二部分
echo "hello world linux" | cut -d' ' -f2
输出:world
-d' ':指定分隔符为空格(可替换为其他字符如 -d':')。
-f2:截取第二个字段。 1开始