0x04-2 RHEL linux Shell脚本
编写Shell脚本
可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。要想正确使用Shell中的这些功能特性,准确下达命令尤为重要。Shell脚本命令的工作方式有两种:交互式和批处理。
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
shell脚本不仅用到前面学习过的很多Linux命令以及正则表达式、管道符、数据流重定向等语法规则还需要把内部功能模块化通过逻辑语句进行处理。最近形成shell脚本。
系统本身已经默认使用了bash作为命令行终端解释器了:
[root@pantao ~]# echo $SHELL /bin/bash
编写简单的shell脚本
linux命令按照顺序依次写入一个文件中,这就是一个简单的shell脚本
shell脚本的组成:①#!/bin/bash 脚本申明 ②#注释③脚本命令
例如:列出当前的目录,以及当前文件下所有文件的属性信息。
#!/bin/bash #pwd,ls pwd ls -la
输出:
[root@pantao shell]# bash ls.sh /root/shell total 32 drwxr-xr-x. 2 root root 77 Nov 18 15:22 . dr-xr-x---. 6 root root 4096 Nov 18 15:22 .. -rw-r--r--. 1 root root 144 Nov 5 10:48 115.txt -rw-r--r--. 1 root root 12288 Nov 5 11:35 .115.txt.swp -rw-r--r--. 1 root root 31 Nov 18 15:20 ls.sh -rw-r--r--. 1 root root 7 Nov 1 10:36 l.txt -rw-r--r--. 1 root root 51 Nov 1 10:34 test.py
接收用户的参数
内设了用于接收参数的变量,变量之间可以使用空格间隔。例如$0对应的是当前Shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第N个位置的参数值。

我们来看一个小例子:
#!/bin/bash echo "当前的脚本名称$0" echo "总共有$#个参数,分别是$*" echo "第一个参数为$1,第四个为$4"
[root@pantao shell]# bash example.sh 1 2 3 4 5 6 7
当前的脚本名称example.sh
总共有7个参数,分别是1 2 3 4 5 6 7
第一个参数为1,第四个为4
判断用户参数
测试对象来划分,条件测试语句可以分为4种:
文件测试语句;
逻辑测试语句;
整数值比较语句;
字符串比较语句。
文件测试所用的参数
| 操作符 | 作用 |
| -d | 测试文件是否为目录类型 |
| -e | 测试文件是否存在 |
| -f | 判断是否为一般文件 |
| -r | 测试当前用户是否有权限读取 |
| -w | 测试当前用户是否有权限写入 |
| -x | 测试当前用户是否有权限执行 |
[root@pantao ~]# [空格 -d /etc/passwd 空格] [root@pantao ~]# echo $? 1
上面的$?是shell内设的,是显示上一条命令的返回值,如果为0,则目录存在,如果为非0,目录则不存在
逻辑测试语句
&& 与 -命令执行为真(0)时候输出后面的命令 与两个都为真才为真,如果第一个是假,那么就不会输出后面
|| 或 -命令执行为假(1)时候输出后面的命令 或任意一个为真就为真,如果第一个是真了,那么后面不会去执行,他就已经是真了
! 非 前面参数是真(0) 后面就为假(1) -假就为真
例子:
[root@pantao ~]# [ -d /etc/ ] && echo "是目录" 是目录
例子2:
[root@pantao ~]# [ $USER = root ] || echo "普通用户"#没输出,说明是root [root@pantao ~]# su - pantao #切换用户 [pantao@pantao ~]$ [ $USER = root ] || echo "普通用户" 普通用户
例子3:
[root@pantao ~]# [ $USER != root ] && echo "user" || echo "root" root
可用的整数比较运算符
| 操作符 | 作用 | 英文全称方便记忆 |
| -eq | 是否等于 | equal |
| -ne | 是否不等于 | not equal |
| -gt | 是否大于 | greater than |
| -lt | 是否小于 | less than |
| -le | 是否等于或小于 | less than or equal |
| -ge | 是否大于或等于 | greater than or equal |
测试一下10是否大于10以及10是否等于10(通过输出的返回值内容来判断):
[root@pantao ~]# [ 10 -eq 10 ] [root@pantao ~]# echo $? 0 [root@pantao ~]# [ 10 -gt 10 ] [root@pantao ~]# echo $? 1 [root@pantao ~]#
设置内存超出预期自动报警
[root@pantao ~]# FreeM=`free -m |grep Mem: | awk '{print $4}'`
[root@pantao ~]# [ $FreeM -gt 1024 ] && echo "内存不足"
流控制语句
常见的有if 、for 、while、case
使用格式
if语句
|
if 条件 then 命令 if
|
if 条件 then else if
|
if then elif then else 命令 fi |
例如判断改文件夹是否存在/media/cdrom文件是否存在,存在就结束,不存在就创建一个这个目录
#!/bin/bash #ls dir="/media/cdrom" if [ ! -e $dir ] then mkdir -p $dir fi ~ ~
for条件循环语句
|
for 变量名 in 取值列表 do 命令序列 done |
我们使用一个批量添加新用户,用户面先写到一个文件里。
#!/bin/bash #添加用户 for i in $(cat /root/bash/users.txt) do useradd $i echo "123456" |passwd --stdin $i done ~ [root@pantao bash]# bash for.sh Changing password for user cat. passwd: all authentication tokens updated successfully. Changing password for user xiao. passwd: all authentication tokens updated successfully. Changing password for user qiao. passwd: all authentication tokens updated successfully. Changing password for user liu. passwd: all authentication tokens updated successfully. Changing password for user pan. passwd: all authentication tokens updated successfully. Changing password for user li. passwd: all authentication tokens updated successfully.
while条件循环语句
|
while 条件 do 命令 done |
例子:猜商品价格
case条件测试语句
|
case 变量值 in 模式1) 命令 ;; 。。。。 *) 默认命令序列 esac |
这个有点像c语言里面的swich语句
例如:
#!/bin/bash read -p "随你输入:" GILL case "$GILL" in [a-z]|[A-Z]) echo "字母" ;; [0-9]) echo "数字" ;; *) echo "其他字符" esac
[root@pantao ~]# bash case 随你输入:a 字母 [root@pantao ~]# bash case 随你输入:1 数字 [root@pantao ~]# bash case 随你输入:aa11 其他字符

浙公网安备 33010602011771号