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就该这么学》和工作中涉及到的命令进行总结,转载请注明出处,如有侵权请联系删除!