Linux-最实用shell脚本编程

这篇博客,对很多人来说都是一个挑战,耐下心来,好好琢磨,你一定会得到你想要的。接下来的各种命令一定要严格按照博客内容去书写去执行,唯有严格要求脚踏实地才能有所进步。

小技巧-小智慧

当下面遇到看不懂的,可以在这里找到相应的解释。

  1. 常用环境变量:$SHELL $USER #LANG
    依次为:解释器、当前用户名、当前语系
  2. awk '{print $4}' 【取某行的第四列的值】
  3. free_size=`free -m | grep Mem: | awk ‘{print $4}’`【在使用赋值语句时,等号两边不能有空格
  4. read -p "提示信息:" GRADE 【读取用户的输入信息,作为变量GRADE】
  5. useradd abong【/bin/bash、家目录为/home/abong、基本用户组abong、无密码】
  6. echo "password" | passwd --stdin abong【以标准输入的方式为用户设置密码】
  7. /dev/null 文件,是一个黑洞文件,可以将不想显示在屏幕上的输出重定向到该文件
  8. $?可以判断上一个命令的执行结果,执行成功返回0,执行不成功返回2
  9. `命令`【返回命令执行的结果】
  10. $(命令) 【返回命令执行的结果】
  11. let TIMES++【让变量TIMES自加1,等价于TIMES=TIMES+1】
  12. exit 0 【终止脚本的运行,该命令后续的脚本都不再运行】
  13. while true【表示一直循环,不退出循环,直到遇到exit 0才退出循环】
  14. 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

在这里插入图片描述

在学习了上面的知识后,已经可以写出较为复杂的shell脚本了,欠缺的就是实战经验了。

发布了33 篇原创文章 · 获赞 25 · 访问量 9491

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/104455537