s h e l l shell shell不仅仅充当用户与 U N I X UNIX UNIX或者 L i n u x Linux Linux交互界面的角色,还可以作为一种程序设计语言来使用。通过 S h e l l Shell Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。
s h e l l shell shell脚本程序有以下两种执行方式:
- 用户可以输入一系列的命令,交互式地执行它们
- 用户也可以把所有的这些命令按照顺序保存在一个文件中,然后将该文件作为一个程序来执行
交互式程序
直接在终端输入一系列命令,由shell来判断何时输入完毕
例1:在当前目录下查找文件名包含" s h sh sh"这3个字符的文件。如果找到的话,则在当前的屏幕上打印出来。
root@VM-0-2-ubuntu:/home/ubuntu/shell# for filename in `ls .` #注意这里是反引号
> do
> if echo "$filename" | grep "sh"
> then
> echo "$filename"
> fi
> done
ex1-3.sh
ex1-3.sh
ex1-4.sh
ex1-4.sh
ex1-5.sh
ex1-5.sh
ex1-7.sh
ex1-7.sh
ex1-8.sh
ex1-8.sh
ex1-9.sh
ex1-9.sh
ex3-1.sh
ex3-1.sh
ex3-2.sh
ex3-2.sh
ex3-3.sh
ex3-3.sh
ex3-4.sh
ex3-4.sh
当 s h e l l shell shell期待用户下一步的输入时,正常的 s h e l l shell shell提示符“#”将会改变为“>”。用户可以一直输入下去,由 s h e l l shell shell来判断何时输入完毕并执行程序
创建脚本
s h e l l shell shell脚本:包含多个 s h e l l shell shell语句的文件
例2:使用 v i vi vi/ v i m vim vim命令创建 s h e l l shell shell脚本文件
#! /bin/sh
#for循环开始
for filename in `ls .`
do
#如果文件名包含sh
if echo "$filename" | grep "sh"
then
#输出文件名
echo "$filename"
fi
done
把脚本设置为可执行(授予权限)
将脚本编辑完后,该脚本并不能马上执行。在 L i n u x Linux Linux中,当用户执行某个程序时,必须拥有该文件的执行权限。
我们可以来测试一下,创建一个 S h e l l Shell Shell脚本,然后用 l l ll ll或 l s − l ls -l ls−l来查看该 s h e l l shell shell脚本的权限:
root@VM-0-2-ubuntu:/home/ubuntu/shell# ll
total 52
-rw-r--r-- 1 root root 136 Mar 5 23:01 ex1-2.sh
-
通常情况下,每个文件的访问权限都由9位组成,其中最前面3位表示文件的所有者对于该文件的访问权限,中间3位表示与所有者同组的其他用户对于该文件的访问权限,最后3位表示其他组的用户对于该文件的访问权限
-
在每一组权限中,都用3个字母来表示3中不同的权限,r表示读取权限,w表示写入权限,x表示执行权限
加权限
使用chmod命令使得用户拥有某个文件的执行权限:
chmod [options] filename
o p t i o n s options options表示各种权限选项。可使用 r r r、 w w w、 x x x这三个字母分别表示读取、写入和执行的权限,也可以使用数字来表示权限。在数字模式下,4表示读取权限,2表示写入权限,1表示执行权限,7为3个数字的和。另外,还可以指定执行权限授予的对象,其中 u u u表示文件的所有者, g g g表示所有者所属的组, o o o表示其他组的用户。在授予权限时,操作符加号"+“表示授予权限,减号”-"表示收回权限。
例3:给上述的ex1-2.sh授予权限:
root@VM-0-2-ubuntu:/home/ubuntu/shell# chmod u+x ex1-2.sh
root@VM-0-2-ubuntu:/home/ubuntu/shell# ll
total 52
-rwxr--r-- 1 root root 136 Mar 5 23:01 ex1-2.sh*
当授予用户执行权限后,就可以执行该脚本了:
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-2.sh
ex1-2.sh
ex1-2.sh
ex1-3.sh
ex1-3.sh
ex1-4.sh
ex1-4.sh
ex1-5.sh
ex1-5.sh
ex1-7.sh
ex1-7.sh
ex1-8.sh
ex1-8.sh
ex1-9.sh
ex1-9.sh
ex3-1.sh
ex3-1.sh
ex3-2.sh
ex3-2.sh
ex3-3.sh
ex3-3.sh
ex3-4.sh
ex3-4.sh
777是一个特殊的权限,表示所有的用户都可以读、写和执行该文件。许多用户为了操作上的方便,会将此权限授予某些文件,这样的操作可能会带来安全隐患,因此,在授予该权限时,需谨慎
向脚本传递参数
很多情况下, s h e l l shell shell脚本都需要接受用户的输入,根据用户的输入的参数来执行不同的操作。
常用的与参数传递有关的系统变量
变量名 | 说明 |
---|---|
$n | 表示传递给脚本的第n个参数,例如$1表示第1个参数,$2表示第二个参数… |
$# | 命令行参数的个数 |
$0 | 当前脚本的名称 |
$* | 以”参数1 参数2 参数3…“的形式返回所有参数的值 |
$@ | 以”参数1“ ”参数2“ ”参数3“…的形式返回参数的值 |
$_ | 保存之前执行命令的最后一个参数 |
如果用户传递的参数多于9个,则不能使用$10来引用第10个参数。为了能够获取第10个参数的值,用户必须处理或保存第1个参数,即$1,然后使用shift命令删除参数1并将所有剩余的参数下移1位,此时$10就变成了$9,以此类推
例4:传递脚本参数
#! /bin/bash
echo "$# parameters"
echo "$@"
结果:
root@VM-0-2-ubuntu:/home/ubuntu/shell# chmod +x ex1-3.sh
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-3.sh a "b c"
2 parameters
a b c
参数扩展
上述的这种传递参数的方式已无法满足需求,因此需要参数扩展
类似于 L i n u x Linux Linux下的 l s ls ls − l -l −l技术,用户可以在 s h e l l shell shell程序中使用同样的技术,称为参数扩展。为了获取到这些参数,用户需要在 s h e l l shell shell程序中使用 g e t o p t s getopts getopts命令
例5:介绍如何使用参数扩展
#! /bin/bash
#输出参数索引
echo "OPTIND starts at $OPTIND"
#接受参数
while getopts ":pq:" optname
do
case "$optname" in
"p")
echo "Option $optname is specified"
;;
"q")
echo "Option $optname has value $OPTARG"
;;
"?")
echo "Unknown option $OPTARG"
;;
":")
echo "No argument value for option $OPTARG"
;;
*)
# should not occur
echo "Unknown error while processing options"
;;
esac
echo "OPTIND is now $OPTIND"
done
结果:
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -p
OPTIND starts at 1
Option p is specified
OPTIND is now 2
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -q
OPTIND starts at 1
No argument value for option q
OPTIND is now 2
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -f
OPTIND starts at 1
Unknown option f
OPTIND is now 2
当找到某个选项时, g e t o p t s getopts getopts命令返回 t r u e true true。第二个参数是变量名 o p t n a m e optname optname,该变量将接收找到选项的名称