Linux Shell脚本入门

本文详细介绍了Shell脚本的基础知识,包括交互式与批处理两种工作方式,以及脚本参数的使用。深入探讨了if、for、while、case四种流程控制语句的语法与应用场景,帮助读者掌握Shell脚本的高级编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shell脚本命令的工作方式有两种:交互式和批处理
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
Shell脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh后缀加上,以表示是一个脚本文件。

脚本程序参数

$0:脚本本身文件名称
$#:参数个数
$* 与 $@:所有参数列表
$?:对应的是显示上一次命令的执行返回值
$1:命令行第一个参数,$2为第二个,以此类推
$$::脚本运行的当前进程ID号

$*$@的区别
当命令行为test.sh 1 2 3
"$*“表示"1 2 3”
"$@“表示"1” “2” “3”
二者没有被引号括起来时是一样的都为"1 2 3",只有当被引号括起来后才表现出差异

$()  等同于: ``(反引号):运行一段命令
echo today is $(date "+%Y-%m-%d")
echo today is `date "+%Y-%m-%d"`
都输出today is 2019-08-01
$()的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

$(()) 进行数字运算 
# a=3;b=2;c=5
# echo $((a+b*c))
#!/bin/bash 
#For Example BY linuxprobe.com 
pwd 
ls -al

在上面的这个脚本中实际上出现了三种不同的元素:
第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;
第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;
第三、四行的可执行语句也就是我们平时执行的Linux命令了。

流程控制语句

if、for、while、case4种流程控制语句

if条件测试语句

if条件测试语句可以让脚本根据实际情况自动执行相应的命令。从技术角度来讲,if语句分为单分支结构、双分支结构、多分支结构。

#单分支的if语句
if 条件测试操作				if	目录不存在
	then 命令序列				then 创建该目录
fi							fi
#!/bin/bash
# 判断/media/cdrom文件是否存在,若存在就结束条件判断和整个Shell脚本,反之则去创建这个目录
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
# 双分支的if语句
if 条件测试操作				if	能够ping通
	then 命令序列1				then 提示该服务器正常工作
	else 命令序列2				else 报警服务器出现问题
fi							fi
#!/bin/bash
# 使用双分支的if条件语句来验证某台主机是否在线,然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
# 多分支结构
if 条件测试操作1				if	分数为85-100之间
	then 命令序列1				then 判为优秀
elif 条件测试操作2			elif 分数为70-84之间
	then 命令序列2				then 判断为合格
else 						else
	命令序列2					判为不合格
fi							fi
#!/bin/bash
# 使用多分支的if条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Excellent、Pass、Fail等提示信息
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail" 
fi
for条件循环语句

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过了。

# for循环语句的语法格式
for 变量名 in 取值列表						for 用户名 in 列表文件
do											do		
	命令序列										创建用户并设置密码
done										done
#!/bin/bash
# 使用for循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
while条件循环语句

while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于for循环语句中有目标、有范围的使用场景。while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。

# while循环语句的语法格式
while 条件测试操作				while 未猜中正确价格
do								do
	命令序列							反复猜测商品价格
done							done
#!/bin/bash
# 猜测数值大小的脚本
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
case条件测试语句

case条件测试语句和switch语句的功能非常相似!case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。

# case条件测试语句的语法结构
case 变量值 in							case 变量值 in
模式1)									[a-z]|[A-Z])
	命令序列1								提示为字母
	;;										;;
模式1)									[0-9])
	命令序列2								提示为数字
	;;										;;
	......									......
*)										*)
	默认命令序列								提示为特殊字符
esac									esac
#!/bin/bash
# 提示用户输入一个字符并将其赋值给变量KEY,然后根据变量KEY的值向用户显示其值是字母、数字还是其他字符。
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac

以上内容根据《Linux就该这么学》和工作中涉及到的命令进行总结,转载请注明出处,如有侵权请联系删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值