1. Shell脚本基础
1.1 脚本编写的基础:
- 指令的执行时从上而下,从左往右的执行
- 指令的下达时,指令,选项与参数之间的多个空白都会被忽略掉
- 空白行业会被忽略,多个[tab]的空白同样视为空格键
- 读取到一个[Enter](CR),就尝试执行该行(或者该串)命令
- \[Enter]可以把命令延伸到下一行
- #可以作为注释
1.2 指令下达的基础:
- 直接指令下达:shell.sh文件必须要具备可读与可执行(rx)的权限
- 绝对路径:/home/junzerg/shell.sh
- 相对路径:./shell.sh
- 变量PATH:将
- 以bash程序执行:通过
bash shell.sh
或者sh shell.sh
执行
1.3 hello world
#!/bin/bash
#Program:
# This program shows "hello world!" on the screen.
#Version
# 0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
echo "hello junzerg!"
exit 0
程序由一下几个部分组成:
- #! 指定这个脚本使用的shell名称:本例和大部分情况下使用的是/bin/bash。
- 之后#开头的是对文件的注释说明,一般包括内容与功能,版本信息,作者与联系方式,建立日期,历史版本记录
- 主要环境变量的声明
- 主要程序部分
- 执行结果返回
2. 参数
2.1 默认参数
- #0:代表执行的脚本文件名
- #1,#2,#3……:代表第n个参数
- $#:代表后接的参数数量
- $@:代表所有参数,各参数是独立的(用"包住")
- $*:代表素有参数,各参数不独立,用""包住,用空格隔开。
2.2 参数偏移
shift命令可以造成参数变量,拿掉前面那个参数。如果加上数字作为参数的话,可以拿掉最前面的n个参数。
例子:
#!/bin/bash
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> $@"
shift
echo "Total parameter number is ==> $#"
echo "Yore whole paramter is ==> $@"
shift
echo "Total parameter number is ==> $#"
echo "Yore whole paramter is ==> $@"
shift
echo "Total parameter number is ==> $#"
echo "Yore whole paramter is ==> $@"
shift
执行可以看到:
[root@iZwz9ayvrn26ptadymu9ymZ shell]# sh shift_paras.sh one two three four five
Total parameter number is ==> 5
Your whole parameter is ==> one two three four five
Total parameter number is ==> 4
Yore whole paramter is ==> two three four five
Total parameter number is ==> 3
Yore whole paramter is ==> three four five
Total parameter number is ==> 2
Yore whole paramter is ==> four five
3. 条件判断
3.1 test指令
test指令参数参考:http://man.linuxde.net/test
例子:
!#/bin/bash
#输入文件名,判断使用者是否有输入字符串
echo -e "Please input a filename ,I will check the file's type and permission.\n"
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 exist" && exit 0
# 判断文件类型与属性
test -f ${filename} && filetype="regulare file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"
echo "The filename:${filename} is a ${filetype}"
echo "And the permissions for you are : ${perm}"
3.2 判断符号 [ ]
- 中括号([,])可以用来进行数据的判断。
- 中括号内两端需要用空格分隔
- 中括号内的每个组件都需要有空格键来分隔
- 中括号内的变量,最好都以双引号括起来
- 中括号内的常量,组好都用单引号或者双引号括起来
例子:
#!/bin/bash
#blah blah
read -p "Please input (Y/N):" yn
[ "${yn}" == "Y" -o "{$yn}" == "y" ] && echo "OK, continue!" && exit 0
[ "${yn}" == "N" -o "{$yn}" == "n" ] && echo "Oh,interrupt!" && exit 0
echo "I don't konw what your choice is " && exit 0
4. 分支
4.1 if...then
单层,简单条件判断式
if[ 条件判断 ]; then
当条件成立时,可以进行的工作
fi
在使用中括号作为条件判断时可以:
- && 表示and,即test命令中的 -a参数
- || 表示or,即test命令中的-o参数
例如,一下两个式子是等价的:
[ "${yn}" == "Y" -o "${yn}" == "y"]
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
多层,复杂判断式
if [ 条件判断式 ]; then
当条件判断成立时,执行的指令
else
当条件判断不成立时,执行的指令
fi
更复杂的情况为:
if [ 条件判断式一 ]; then
当条件判断式一成立时,执行的指令
elif [ 条件判断式二 ]; then
当条件判断式二成立时,执行的指令
else
当条件判断式一和二都不成立时,执行的指令
fi
4.2 case ... esac
case $变量名称 in
"第一个变量内容")
指令
;;
"第二个变量内容")
指令
;;
*)
不包含第一个变量内容和第二个变量内容时执行的指令
exit 1
;;
esac
例如:
#!/bin/bash
#blah blah
case ${1} in
"a")
echo "Hello ${1}"
;;
"b")
echo "${1} Hello"
;;
[0-9])
echo "Hello number"
;;
*)
echo "Usage ${0} {hello}"
;;
esac
5. 循环
5.1 while do done
当condition条件成立时,就进行循环,直到condition的条件不成立。
while [ condition ]
do
指令
done
5.2 until do done
当condition条件不成立时,进行循环,直到condition条件成立。
until [ condition ]
do
指令
done
5.3 for ... do ... done
数组中的循环
for var in con1 con2 con3 ...
do
指令
done
例子一:
echo -e "Animals:"
for animal in dog cat mouse
do
echo "There is a ${animal}."
done
运行结果为:
Animals:
There is a dog.
There is a cat.
There is a mouse.
可以使用Linux内建机制处理,例如seq命令和...:
for i in $(seq 1 100)
for i in $(seq a...g)
6. 函数
函数的语法:
function fname() {
指令
}
注意:
- 由于shellscript的执行方式是由上而下,因此shell script当中的function的设定一定要在程序的最前面。
- function也是具有内建变量的,函数明后才能用$0,表示,后续变量也是用$1,$2...取代。
7. shell执行的参数
shell执行可以通过参数的设定来debug
sh [-nvx] scripts.sh
-n :不要执行script,仅查询语法
-v :执行script钱,现将script内容输出到屏幕
-x : 将使用到的script内容显示到屏幕上