Shell 命令脚本
Shell 脚本文件的名称可以任意,建议将.sh 后缀加上,以表示是一个脚本文件。
- 创建脚本:
vim example.sh
- 写好脚本的内容(就是连串的shell语句)
- 执行脚本:(后面的是参数)
bash example.sh
sh example.sh
./example.sh
(一般会有权限不足的报错,升权限就好了)
简单的脚本
1#!/bin/bash
2#For Example BY linuxprobe.com
3pwd
4ls -al
在上面的这个 example.sh 脚本中实际上出现了三种不同的元素:
- 第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;
- 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;
- 第三、四行的可执行语句也就是我们平时执行的 Linux 命令了。
带参数的脚本-接收参数
如何运行带参数的脚本:
1sh example.sh one two three four five six
脚本内容:
1#!/bin/bash
2echo "当前脚本名称为$0"
3echo "总共有$#个参数,分别是$*。"
4echo "第 1 个参数为$1,第 5 个为$5。"
~ | ~ |
---|---|
$0 | 对应的是当前 Shell 脚本程序的名称, |
$# | 对应的是总共有几个参数 |
$* | 对应的是所有位置的参数值 |
$? | 对应的是显示上一次命令的执行返回值 |
$1、$2、$3 | 则分别对应着第 N 个位置的参数值 |
带参数的脚本-判断用户的参数
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
— | 0代表存在,否则不存在 |
例子: 下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。
1root@KASUSA-cloud:~# [ -f mydir ]
2root@KASUSA-cloud:~# echo $?
31
&&
符号,||
符号
&&,它表示当前面的命令执行成功后才会执行它后面的命令
判断目录是否存在:
1[ -e mydir ] && echo "Exist"
表示当前面的命令执行失败后才会执行它后面的命令,
因此可以用来结合系统环境变量 USER 来判断当前登录的用户是否为非管理员身份:
1[ $USER = root ] || echo "user"
一个复杂一点的判断用户的例子:
1 [ ! $USER = root ] && echo "user" || echo "root"
运算比较符
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
流程控制语句
if 条件测试语句
for 条件循环语句
批量创建用户脚本: 创建 user.txt
1vim users.txt
1andy
2barry
3carl
4duke
5eric
6george
创建脚本 Example.sh
1 vim Example.sh
1#!/bin/bash
2read -p "Enter The Users Password : " PASSWD
3for UNAME in `cat users.txt`
4 do
5 id $UNAME &> /dev/null
6 if [ $? -eq 0 ]
7 then
8 echo "Already exists"
9 else
10 useradd $UNAME &> /dev/null
11 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
12 if [ $? -eq 0 ]
13 then
14 echo "$UNAME , Create success"
15 else
16 echo "$UNAME , Create failure"
17 fi
18 fi
19done
需要多说一句,/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
while 条件循环语句
执行前并不确定最终执行的次数
例子:
1#!/bin/bash
2#在CASE变量小于等于20的时候一直运行
3CASE=0 #初始化变量
4echo "case = $CASE" #显示变量
5while [ $CASE -le 20 ] #while条件
6do #while开始
7CASE=`expr $CASE + 1` #相当于CASE++
8echo "case = $CASE" #显示下CASE的值
9done #结束