Shell脚本命令的工作方式有两种:交互式和批处理。
[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
[root@iZm5e8qz9uhnllcbkgfntuZ study]# [ -f example.sh ] && echo 'Exist'
Exist
[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
判断目录是否存在,不存在则创建目录
[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