简单shell 示例
Shell脚本命令的工作方式有两种:交互式和批处理。
- 交互式( Interactive):用户每输入一条命令就立即执行。
- 批处理( Batch):由用户事先编写好一个完整的 Shell脚本, Shell会一次性执行脚本中诸多的命令。
在Shell脚本中不仅会用到前面学习过的很多 Linux命令以及正则表达式、管道符、数据流重定向等语法规则,还需要把内部功能模块化后通过逻辑语句进行处理,最终形成日常所见的 Shell脚本。
查看SHELL变量可以发现当前系统已经默认使用 Bash作为命令行终端解释器了:
[root@linuxprobeecho $SHELL
/bin/bash
4.2.1
[root@iZm5e8qz9uhnllcbkgfntuZ study]# vim example.sh
#!/bin/bash
#For Example BY zhangsan
pwd
ls -al
执行方式1(用bash终端解释执行)
[root@iZm5e8qz9uhnllcbkgfntuZ study]# bash example.sh
/opt/study
total 32
drwxr-xr-x 3 root root 4096 Feb 1 09:04 .
drwxr-xr-x. 7 root root 4096 Jan 22 12:52 ..
-rw-r----- 1 root root 48 Feb 1 09:04 example.sh
drwxr-xr-x 3 root root 4096 Jan 22 12:52 log
-rw-r--r-- 1 root root 704 Jan 31 17:25 readme.txt
-rw-r--r-- 1 root root 19 Jan 22 13:09 test2.log
-rw-r--r-- 1 root root 19 Jan 22 16:13 test3.log
-rw-r--r-- 1 root root 12 Jan 22 13:06 test.log
执行方式二(给文件授予执行权限)
[root@iZm5e8qz9uhnllcbkgfntuZ study]# chmod 777 example.sh
[root@iZm5e8qz9uhnllcbkgfntuZ study]# ./example.sh
/opt/study
total 32
drwxr-xr-x 3 root root 4096 Feb 1 09:06 .
drwxr-xr-x. 7 root root 4096 Jan 22 12:52 ..
-rwxrwxrwx 1 root root 48 Feb 1 09:04 example.sh
drwxr-xr-x 3 root root 4096 Jan 22 12:52 log
-rw-r--r-- 1 root root 704 Jan 31 17:25 readme.txt
-rw-r--r-- 1 root root 19 Jan 22 13:09 test2.log
-rw-r--r-- 1 root root 19 Jan 22 16:13 test3.log
-rw-r--r-- 1 root root 12 Jan 22 13:06 test.log
接受用户参数
像上面这样的脚本程序只能执行一些预先定义好的功能,未免太过死板了。为了让 Shell脚 本程序更好地满足用户的一些实时需求,以便灵活完成工作,必须要让脚本程序能够像之前执行命令时那样,接收用户输入的参数。
Linux系统中的 Shell脚本语言早就考虑到了这些,已经内设了用于接收参数的变量,变量之间可以使用空格间隔。例如
0
对
应
的
是
当
前
S
h
e
l
l
脚
本
程
序
的
名
称
,
,
0对应的是当前 Shell脚本程序的名称, ,
0对应的是当前Shell脚本程序的名称,,#对应的是总共有几 个参数, ,
∗
对
应
的
是
所
有
位
置
的
参
数
值
,
,
*对应 的是 所有位置的参数值, ,
∗对应的是所有位置的参数值,,?对应的是显示上一次命令的执行返回值,而 $1、$2、 $3……则分别对应着第 N个位置的参数值,如图

[root@iZm5e8qz9uhnllcbkgfntuZ study]# vim example.sh
#!/bin/bash
#For Example BY zhangsan
echo "当前hell程序本的名称:$0"
echo "第1个参数:$1, 第3个参数:$3"
echo "总共有多少参数:$# ,每个参数(按顺序)是:$*"
pwd
echo "上一次命令的执行返回值:$?"
执行结果
[root@iZm5e8qz9uhnllcbkgfntuZ study]# ./example.sh one two three four five six
当前hell程序本的名称:./example.sh
第1个参数:one, 第3个参数:three
总共有多少参数:6 ,每个参数(按顺序)是:one two three four five six
/opt/study
上一次命令的执行返回值:0
判断用户参数(判断语法)
Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。条件测试语法的执行格式如图所示。切记,条件表达式两边均应有一个空格。

按照测试对象来划分,条件测试语句可以分为4种:
- 文件测试语句;
- 逻辑测试语句;
- 整数值比较语句;
- 字符串比较语句。
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体的参数
如表所示文件测试所用的参数。

判断文件是否存在,返回0表示存在,返回其他表示不存在
[root@iZm5e8qz9uhnllcbkgfntuZ study]# ll
total 24
-rwxrwxrwx 1 root root 242 Feb 1 10:19 example.sh
drwxr-xr-x 3 root root 4096 Jan 22 12:52 log
-rw-r--r-- 1 root root 704 Jan 31 17:25 readme.txt
-rw-r--r-- 1 root root 19 Jan 22 13:09 test2.log
-rw-r--r-- 1 root root 19 Jan 22 16:13 test3.log
-rw-r--r-- 1 root root 12 Jan 22 13:06 test.log
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ -f example.sh ]
[root@iZm5e8qz9uhnllcbkgfntuZ study]# echo $?
0
- 与符号 &&
终端中逻辑“与”的运算符号是 &&,它表示当前面的命令执行成功后才会执行它后面的命令因此可以用来判文件是否存在,若存在则输出 Exist字样。
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ -f example.sh ] && echo 'Exist'
Exist
- 或符号 ||
表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量 USER来判断当前登录的用户是否为testuser1 用户,如果不是该用户,输出此时用户名称
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ $USER = testuser1 ] || echo "$USER"
root
- 非 !
系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的。
,再判断当前用户是否为一个非管理员的用户。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ $USER != testuser1 ] || echo "$USER"
testuser1
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ $USER != root ] || echo "$USER"
[root@iZm5e8qz9uhnllcbkgfntuZ study]#
综合
当前我们正在登录的即为管理员用户root。下面这个示例的执行顺序是,先判断当前登录用户的 USER变量名称是否等于 root,然后用逻辑运算符“非”进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户了。最后若条件成立则会根据逻辑“与”运算符输出 user字样;或条件不满足则会通过逻辑“或”运算符输出 root字样,而如果前面的&&不成立才会执行后面的 ||符号。
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ ! $USER = root ] && echo 'user' || echo 'root'
root
-
整数比较
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。可用的整数比较运算符如表所示。


-
进阶
我们知道free命令,它可以用来获取当前系统正在使用及可用的内存量信息。接下来先使用 free -m命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,最后用 FreeMem=语句的方式把语句内执行的结果赋值给变量。
FreeMem=free -m |grep Mem: |awk ‘{print $4}’变量赋值时=号两边不能有空格
[root@iZm5e8qz9uhnllcbkgfntuZ study]# free -m
total used free shared buff/cache available
Mem: 1837 473 915 0 448 1214
Swap: 0 0 0
[root@iZm5e8qz9uhnllcbkgfntuZ study]# free -m |grep Mem:
Mem: 1837 473 915 0 448 1214
[root@iZm5e8qz9uhnllcbkgfntuZ study]# free -m |grep Mem: |awk '{print $4}'
915
[root@iZm5e8qz9uhnllcbkgfntuZ study]# FreeMem=`free -m |grep Mem: |awk '{print $4}'`
[root@iZm5e8qz9uhnllcbkgfntuZ study]# echo $FreeMem
914
上面用于获取内存可用量的命令,我们使用整数运算符来判断内存可用量的值是否小于 1024,若小于则会提示“ Insufficient Memory”(内存不足)的字样
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ $FreeMem -lt 1024 ] && echo 'Insufficient Memory'
Insufficient Memory
- 字符串比较
| 运算符 | 作用 |
|---|---|
| = | 比较字符串是否相同 |
| != | 比较字符串是否不同 |
| -z | 判断字符串内容是否为空 |
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ -z $string ]
[root@iZm5e8qz9uhnllcbkgfntuZ study]# echo $?
0
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ -z $FreeMem ]
[root@iZm5e8qz9uhnllcbkgfntuZ study]# echo $?
1
流程控制语句 (if 、for 、while、case)
- if条件测试语句
if条件测试语句可以让脚本根据实际情况自动执行相应的命令。从技术角度来讲, if语句分为单分支结构、双分支结构、多分支结构;其复杂度随着灵活度一起逐级上升。if条件语句的单分支结构由 if、 then、 fi关键词组成,而且只在条件成立后才执行预设的命令,相当于口语的“如果……那么……”。单分支的 if语句属于最简单的一种条件判断结构,语法格式如图所示。

判断目录是否存在,不存在则创建目录
[root@iZm5e8qz9uhnllcbkgfntuZ study]# vim example-if.sh
#!/bin/bash
DIR=/opt/study/controller
if [ ! -e $DIR ]
then
echo "$DIR not exist"
mkdir $DIR
echo "mkdir $DIR success"
fi
这里我没有给example-if.sh 文件授予可执行权限,直接用的bash执行,你可以授权(chmod -777 example-if.sh)后执行
[root@iZm5e8qz9uhnllcbkgfntuZ study]# bash example-if.sh
/opt/study/controller not exist
mkdir /opt/study/controller success
[root@iZm5e8qz9uhnllcbkgfntuZ study]# ll
total 20
drwxr-xr-x 2 root root 4096 Feb 1 16:46 controller
-rw-r--r-- 1 root root 124 Feb 1 16:46 example-if.sh
-rwxrwxrwx 1 root root 242 Feb 1 10:19 example.sh
-rw-r--r-- 1 root root 704 Jan 31 17:25 readme.txt
-rw-r--r-- 1 root root 12 Jan 22 13:06 test.log
本文介绍Shell脚本的基础知识,包括Shell脚本的两种工作方式、如何接收用户参数、条件测试语法,以及流程控制语句的使用。通过示例展示了如何创建、执行Shell脚本,并进行参数处理和条件判断。
16万+

被折叠的 条评论
为什么被折叠?



