- 脚本要求
- 文件后缀最好.sh,这样容易区分脚本文件
- 要有脚本解析器声明
- 要有脚本注解声明
- 编辑脚本 vim xxx.sh
- 执行脚本 bash 【脚本名称】或者sh 【脚本名称】
- 有参数的脚本在正常执行语句后追加,多个用空格间隔,例如:sh xxx.sh one tow three four five
- 编写第一个简单的脚本
- 第一行#!脚本声明采用的Shell解析器
- 第二行# 备注该脚本的作用
- 第三行以下是脚本要执行的命令:1.输出“Hello sh”;2.查看当前所在目录;3.查看当前目录所有文件
#!/bin/bash
#test of sh
echo Hello sh
pwd
ls -al
- 接收参数的脚本
- 第一行#!脚本声明采用的Shell解析器
- 第二行# 备注该脚本的作用
- $0获取脚本名字;$#获取参数总和;$【整数】获取整数对应的参数;$*列出所有参数
#!/bin/bash
#test of param sh
echo 当前脚本的名字是$0
echo 当前脚本一共接收了$#参数
echo 第一个参数是 :$1,第三个参数是:$3
echo 列出所有参数 :$*
echo over
- 运算符
- 格式 [空格+判断语句+空格],例如:[ -f /root/chenyb ]
- 在centOS中运算符很严谨,例如:[ 1 -eq 1 ] √注意‘=’两边必须有空格;[ 1-eq1 ] ×;[ ! $USER = root ] √注意‘!’后面与‘=两边都有空格’;[ !$USER=root ] ×;[ ! $USER=root ] ×
- 输出执行结果 echo $?
运算符 | 作用 |
---|---|
文件操作 | |
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断文件是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
测试返回true用0表示;如果为非0的其他数字(随机数)表示是false | |
逻辑操作与、或、非 | |
&& | 与,证明返回结果是成立的,可以接逻辑与逻辑,例如:[ -d /root] && echo is catalog ,测试root是否是一个目录,如果执行结果成立就输出“is catalog” |
|| | 或,证明返回结果是成立的,可以接逻辑或逻辑,例如:[ -f /root/test.txt] || echo not file,测试test.txt是否是一般文件,如果执行结果不成立就输出“not file” |
! | 非,非当前关系,在原基础上否定当前结果,与当前结果是相反的,例如:[ ! $USER |
整数比较符(仅适用于整数之间比较) | |
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
字符串比较符(仅适用于整数之间比较) | |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空,例如: [ -z $LANG ] ; echo $? |
- if条件测试语句
- if语句分但分支结构、双分支结构、多分支结构
- 单分支结构
- 判断当前目录存在aa目录是否,如果不存在创建一个
#!/bin/bash
# one if test
DIR="./aa"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
- 双分支结构
- ping一个地址$存值,看其通不通,通会走then分支,不通会走else分支,最后输出罗列参数,测试语句:bash 脚本 ip
#!/bin/bash
# double if test
if [ $? -eq 0 ]
then
echo "$1 OK!"
else
echo "$1 NO!"
fi
echo $*
- 多分支结构
- read - p 脚本运行后在输入框获取数据,读取的数据赋值给CASE
- 输入0-100之外的数字会提示不在范围内,非数字会报错,然后提示error
- 80-100分很好;60-80之间为及格;60分以下为不及格
#!/bin/bash
#if elif lese test
read - p "case (0-100):" CASE
echo "case:$CASE"
if [ $CASE -gt 100 ] || [ $CASE - lt 0 ] ; then
echo "in case not range!"
elif [ $CASE - le 100 ] && [ $CASE -ge 80 ] ; then
echo "$CASE IS GOOD !"
elif [ $CASE -le 80 ] && [ $CASE -ge 60 ] ; then
echo "$CASE IS PASS !"
elif [ $CASE -le 60 ] ; then
echo "$CASE IS NOT PASS !"
else echo "$CASE ERROR !"
fi
- for循环
- list.txt里面存的数据(默认会以空格或回车符分隔)
- LIST=$(cat !/home/chenyb/test/list.txt),读取list.txt文件获取数据赋值给LIST变量
- 格式:for 变量 in 数据对象,do与done之间为循环体,可以写循环逻辑,循环体内引用变量格式:$变量
- 注意语法的开始,先开始的后结束,比如for循环先开始的done就在外层,fi在里层
#!/bin/bash
# for test
LIST=$(cat !/home/chenyb/test/list.txt)
for USER in $LIST
do
echo $USER
if [ $USER = "CHen_Mujiao" ] ; then
echo "IS YOU $USER!"
fi
done
- while循环
- while格式:while 条件 do与done之间为循环体
- 脚本运行后会获取一个0-99的随机数,赋值给CASE:CASE=$(expr $RANDOM % 100)
- 读取一个外界输入的数字
- MSG统计循环执行次数
- 条件判断,如果输入的数字大于随机数提示gt,小于提示lt,等于会提示猜了几次,然后通知答对了并推出循环exit
- 非数字会报错并提示error
#!/bin/bash
# for test
CASE=$(expr $RANDOM % 100)
MSG=0
echo "Guess the number:"
while true
do
read -p "waht's number :" NUM
let MSG++
if [ $NUM -qe $CASE ] ; then
echo "is $MSG NUM OK~! number is $CASE"
exit 0
elif [ $NUM -gt $CAS ] ; then
echo "GT!"
elif [ $NUM - lt $CASE ] ; then
echo "LT!"
else "ERROR!"
fi
done
- case选择
- 输入字母、数字走不同的逻辑,当没满足匹配条件会走*逻辑(*其他)
#!/bin/bash
# for test
read -p "Guess the number :" NUM
case $NUM in
[a-z]) echo "lt's letters $NUM!";;
[0-9] echo "lt's number $NUM!";;
*) echo "lt's characrer $NUM!"
esac