这篇博客,对很多人来说都是一个挑战,耐下心来,好好琢磨,你一定会得到你想要的。接下来的各种命令一定要严格按照博客内容去书写去执行,唯有严格要求脚踏实地才能有所进步。
小技巧-小智慧
当下面遇到看不懂的,可以在这里找到相应的解释。
- 常用环境变量:
$SHELL
$USER
#LANG
依次为:解释器、当前用户名、当前语系 awk '{print $4}'
【取某行的第四列的值】- free_size=`free -m | grep Mem: | awk ‘{print $4}’`【在使用赋值语句时,等号两边不能有空格】
read -p "提示信息:" GRADE
【读取用户的输入信息,作为变量GRADE】useradd abong
【/bin/bash、家目录为/home/abong、基本用户组abong、无密码】echo "password" | passwd --stdin abong
【以标准输入的方式为用户设置密码】/dev/null
文件,是一个黑洞文件,可以将不想显示在屏幕上的输出重定向到该文件$?
可以判断上一个命令的执行结果,执行成功返回0,执行不成功返回2- `命令`【返回命令执行的结果】
- $(命令) 【返回命令执行的结果】
let TIMES++
【让变量TIMES自加1,等价于TIMES=TIMES+1】exit 0
【终止脚本的运行,该命令后续的脚本都不再运行】while true
【表示一直循环,不退出循环,直到遇到exit 0
才退出循环】expr 代数式
命令 | 作用 |
---|---|
expr length "str_length" |
计算字符串长度 |
expr substr "str_substr" n m |
截取字符串,从第n个字符开始,长度为m |
expr index "str_abababadde" a |
计算字符串中某个子串第一次出现的位置 |
expr 10 + 10 |
计算加法 |
expr 18 % 2 |
计算取模 |
expr 30 \* 3 |
计算乘法 |
expr 50 / 2 / 5 |
计算除法 |
一、shell脚本的组成与执行
1、shell脚本的组成
- 脚本声明:
#!/bin/bash
【可通过echo $SHELL
查询解释器名称】【必须在第一行进行脚本声明】 - 脚本注释:
#
【填写注释信息】 - 脚本命令:脚本命令=Linux命令+参数+条件测试语句+流程控制语句+其他
2、shell脚本的执行
法1:bash ex.sh [输入参数]
【bash解释器运行】
法2:./ex.sh
【全路径运行,可能需要权限】
二、脚本知识点
1. 参数
写法 | 作用 |
---|---|
$0 | 脚本名称 |
$# | 参数数量 |
$* | 依次列出各参数值 |
$? | 返回上一个命令的执行结果,执行成功返回0,不成功返回2 |
$1 | 获取第一个参数 |
$2 | 获取第二个参数 |
#!/bin/bash
echo "脚本名称为:$0"
echo "参数个数:$#"
echo "各参数值为:$*"
echo "上一条命令是否执行成功:$?"
echo "第2个参数是:$2"
echo "第4个参数是:$4"
2. 条件测试语句
格式:[ 条件表达式 ]
4种类型的条件表达式:
- 文件测试语句:
[ 参数 文件名 ]
参数 | 作用 |
---|---|
-d | 判断目录是否存在,存在返回true,不存在返回false |
-e | 判断文件是否存在 |
-f | 判断文件是否是一般文件 |
-r | 判断当前用户是否对文件有读权限 |
-w | 判断当前用户是否对文件有写权限 |
-x | 判断当前用户是否对文件有执行权限 |
- 逻辑测试语句:
[ 条件表达式 ] || 后续命令
[ 条件表达式 ] && 后续命令
[ ! 条件表达式 ]
逻辑符 | 作用 |
---|---|
|| | 或,当前面的条件表达式返回fasle时,执行后续命令 |
&& | 与,当前面的条件表达式返回true时,执行后续命令 |
! | 非,条件表达式取反 |
- 整数值比较:
[ a 比较符 b ]
、
比较符 | 作用 |
---|---|
巧记 | e等于、n不、g大于、l小于 |
-eq | 等于 |
-ne | 不等于 |
-ge | 大于等于 |
-le | 小于等于 |
-gt | 大于 |
-lt | 小于 |
- 字符串比较:
[ str1 比较符 str2]
比较符 | 作用 |
---|---|
= | 字符串相等 |
!= | 字符串不相等 |
-z | 判断字符成是否为空 |
#!/bin/bash
#判断文件是否存在
[ -e $1 ] && echo "$1已存在!" || echo “$1不存在”
#!/bin/bash
#判断当前用户是否是root
[ $USER = root ] && echo "当前用户是root" || echo "当前用户不是root"
#!/bin/bash
#判断输入的数字是否大于100
[ $1 -gt 100 ] && echo "输入数字大于100" || echo "输入数字不大于100"
#!/bin/bash
#判断系统内存情况,若不足1G,则提示系统内存不足,否则提醒系统内存充足。
free_size=`free -m | grep Mem: | awk '{print $4}'`
[ $free_size -lt 1024 ] && echo "系统内存不足!" ||echo "系统内存充足!"
3. 流程控制语句
(1)if条件测试语句
① 1个条件一种选择
#!/bin/bash
#判断目录是否存在,若不存在,则创建该目录
if [ ! -e $1 ]
then
mkdir -p $1
fi
② 1个条件,两种选择
#!/bin/bash
#判断网络连通性,若ping通,则提示“服务器工作正常”,若ping不通,则提示“服务器无法ping通”
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "服务器工作正常"
else
echo "服务器无法ping通"
fi
③ 多个条件多个选择
#!/bin/bash
#输入一个分数,判断等级:优秀、合格、不合格
read -p "请输入一个分数:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then echo "优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -lt 85 ]
then echo "合格"
elif [ $GRADE -ge 0 ] && [ $GRADE -lt 70 ]
then echo "不合格"
else
echo "输入的分数有误!"
fi
(2)for条件循环语句
循环次数有限
for 变量名 in 取值列表 【这个变量名没有$,仅仅只是变量名,不用获取值】
#!/bin/bash
#读取用户名表,批量创建用户
read -p "输入默认密码:" PASSWORD
for UNAME in `cat user.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then echo "账户$UNAME 已存在"
else
useradd $UNAME &> /dev/null
echo $PASSWORD | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then echo "创建用户$UNAME 成功!"
else echo "创建用户$UNAME 失败!"
fi
fi
done
(3)while条件循环语句
#!/bin/bash
#系统随机生成一个数字,然后对100取模,通过二分法得到余数
NUM=$(expr $RANDOM % 100)
TIMES=1
echo "该数字在0-99之间,请猜猜这个余数是多少?"
read -p "请输入余数的可能值:" X
while true
do
if [ $X -eq $NUM ]
then echo "恭喜猜对了,这个余数是$NUM"
echo "一共猜测了$TIMES 次"
exit 0
elif [ $X -lt $NUM ] ; then
echo "猜小了"
else
echo "猜大了"
fi
read -p "继续猜:" X
let TIMES++
done
(4)case条件测试语句
注意case条件测试语句的格式
#!/bin/bash
#判断输入的字符是字母还是数字,若都不是,则提示为该字符是特殊字符。
read -p "请输入一个字符,并按Enter键确认:" CHAR
case $CHAR in
[a-z]|[A-Z])
echo "您输入的是一个字母!"
;;
[0-9])
echo "您输入的是一个数字!"
;;
*)
echo "您输入的是一个特殊字符!"
esac