shell script
Shell SCript是一种纯文本文件,帮助我们一次执行多个命令,或者是利用一些逻辑判断帮助我们实现某些功能。(本文适合初学者)
编写第一个script
1 | #!/bin/bash |
说明:
- 第一行#!/bin/bash声明script使用的shell名称
- 整个script除了第一行的#!用来声明shell的之外,其他都是注释作用
- 务必将一些重要的环境变量设置好,这样可以使我们的程序在进行时可以直接执行外部的一些命令,而不必写绝对路径
实现范例1
读取姓、名然后出输出1
2
3
4
5
6#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
read -p "Please input your first name: " firstname
read -p "Please input your last name: " lastname
echo -e "\nYour name is:" $firstname $lastname
实现范例2
1 | #!/bin/bash |
script执行方式的区别
- 使用sh或者 . 来执行script时,该script都会使用一个新的bash环境来执行脚本中的命令。就是说使用这种方式执行时,script是在子进程中执行的,所以子进程的各项变量和操作不会传回到父进程中。例如在子进程中有两个变量a b,使用这种方式执行script之后,echo $a $b 是没有值的。
- 使用source来执行script时,不会开启新的进程来执行,只会在该进程执行,所以echo $a $b 是可以获取到值的。
shell中的判断式
测试功能 test
利用test -e 来判断某一个文件是否存在1
test -e /filename && echo "exit" || echo "Not exit"
test常用指令:1
2
3test -e 该文件名是否存在
test -f 该文件名是否存在且为文件
test -d 该文件名是否存在且为目录
举例:判断一个文件是否存在,给出提示信息,不存在就中断程序,如果存在判断是文件还是目录,并判断执行者对它拥有的权限。1
2
3
4
5
6
7
8
9
10
11
12
13
14vim testfile.sh
#!/bin/bash
read -p "Input a filename: " filename
test -z $filename && echo "You must input a filename" && exit 0 #判断输入的是否是字符串
test ! -e $filename && echo "The filename '$filename' do not exit" && exit 0 #判断文件是否存在
echo -e "\nThe result is $total"
#判断文件的类型和属性
test -f $filename && filetype="file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo -e "\nThe filename: $file is a $filetype"
echo -e "\nThe filename: $file permissions are: $perm"
判断符号[]
[ “$HOME”==”$MAIL” ] 用来判断$HOME和$MAIL是否相同。
举例:当执行一个程序的时候,程序会让用户来选择输入Y继续执行还是输入N停止运行1
2
3
4
5
6
7
8#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
read -p "Please input (y/n): " yn
[ "$yn"=="Y" -o "$yn"=="y" ] && ehco "continue" && exit 0
[ "$yn"=="N" -o "$yn"=="n" ] && ehco "interrupt" && exit 0
echo -e "\nThe result is $total"
shell script中的默认变量
1 | #!/bin/bash |
执行上面脚本,要传递参数1
sh test.sh aa bb
执行结果为:1
2
3
4
5The script name is test
The parameter number is 2
The Whole paratemeter is 'aa bb'
The 1st paratemeter is aa
The 2nd paratemeter is bb
条件判断式
if…then
基本格式:1
2
3
4
5
6
7if[ ... ];then
...
elif[ ... ];then
...
else
...
fi
举例:检测本机中80端口是否启动1
2
3
4
5
6testing=$(netstat -tuln | grep ":80") #netstat -tuln获取当前主机启动的服务
if[ "$testing" != "" ];then
echo "is running"
else
echo "is not running"
fi
case…esca
基本格式:1
2
3
4
5
6
7
8
9case $变量名称 in
"第一个变量内容")
程序段
;;
case $变量名称 in
"第二个变量内容")
程序段
;;
esca
举例:用户输入one、two其中一个,将用户的输入输出到屏幕当中,1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
case $s1 in
"one")
echo "You input is one"
;;
"two")
echo "You input is two"
;;
*)
echo "You input is other"
;;
通过 sh test.sh one 来执行上面的script。
函数function
和我们平时开发中使用到的方法类似,同样拥有内置变量,函数名称代表$0,后续的变量用$1、$2…表示。更改利用function实现之前的script1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
fuction printit(){
echo "You input is $1"
}
case $s1 in
"one")
printit one
;;
"two")
printit two
;;
*)
printit other
;;
循环
while do done,until do done(不定循环)
一般来说,不定循环的最常见状态就是下面两种方法:1
2
3
4while[ ... ]
do
...
done
1 | until[ ... ] |
举例:计算1+2+3+4+…+100的值1
2
3
4
5
6
7
8
9
10
11
12#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
s=0
i=0
while[ "$i"!="100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "The result is : $s"
for…do…done(固定循环)
简单举例:1
2
3
4for animal in dog cat pig
do
echo "The animal is ${animal}"
done
举例:用户输入某文件名,然后找出改文件内的各个文件的权限1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#!/bin/bash
PATH=/bin:/sbin:usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbiin:~/bin
export PATH
#先判断目录是否存在
read "Please input a directory: " dir
if[ "$dir"=="" -o ! -d "$dir" ];then
echo "The directory is not exist"
exit 1
fi
#开始测试文件
filelist=$(ls $dir)
for filename in $filelist
do
perm=""
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo -e "\nThe filename: $file permissions are: $perm"
done
for…do…done的数值处理
举例:1
2
3
4
5
6s=0
for ((i=1;i<=100;i++))
do
s=$(($s+$i))
done
echo "The result is : $s"
shell script的追踪调试
1 | sh -n :不要执行script,仅查询语法问题,如果语法没有问题则不会显示任何信息 |