shell script是利用shell的功能缩写的一个”程序”,这个程序使用纯文本文件,将shell的语法与命令(含外部命令)卸载里面,配合正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
shell script就像是早期DOS年代的批处理文件(.bat),最简单的功能就是将许多命令写在一起。
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。
“#”可作为批注。任何加载#后面的数据将全部被视为批注文字而被忽略。
可以用以下方式来执行.sh的可执行文件
关于exit: exit n
,bash就会退出脚本的执行并将n值返回给?,我们可以echo $?
来查询系统当前的返回值
每个script的文件头处记录如下信息:
[root@www scripts]# vi sh01.sh
#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
#!/bin/bash
# Program:
# User inputs 2 integer numbers; program will cross these two numbers.
# History:
# 2016/05/10 Hanzhou First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
export PATH
echo -e "You SHOULD input 2 numbers, I will cross them! \n"
read -p "first number: " firstnu
read -p "second number: " secnu
total=$(($firstnu*$secnu))
echo -e "\nThe result of $firstnu x $secnu is ==> $total"
declare -i total=$firstnu*$secnu
test -e dmtsai
检测文件dmtsai
是否存在
test的常用参数:
test file1 -nt file2
判断file1 是否比file2新
test file1 -ot file2
判断file1 是否比file2旧
test file1 -ef file2
判断file1 与file2是否为同一个文件,可以用在判断hard link的判定上.主要意义在判定两个文件是否均指向同一个inode
两个整数之间的判定:
-eq 数值相等
-ne 数值不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
判定字符串的数据:
-z 长度为0,返回0(true),否则返回1(false)
-n 长度不为0,返回0(true),否则返回1(false)
多重条件判定
-a 同事满足(and)
-o or
! 取反 test ! -x file
比如我们想要知道$HOME这个变量是否为空
[-z "$HOME" ] ; echo $?
bash语法中使用中括号作为shell的判断式时,必须要注意中括号的两端需要有空格符来分隔
需要空格的位置见下例:(□代表空格)
[□"HOME"□==□"$MAIL"□]
注:bash中两个变量做”判断”时,可以用一个等号,也可以用两个等号”==”
总结:
原因:变量或常量中可能含有空格
$0
,$1
…)示例脚本的文件名为:sh08.sh
#!/bin/bash
# Program:
# Program shows the script name, parameters...
# History:
# 2016/05/11 Hanzhou First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Total parameter number is ==> $#"
echo "Your whole patameter is ==> '$@'"
shift
echo "Total parameter number is ==> $#"
echo "Your whole patameter is ==> '$@'"
shift 3
echo "Total parameter number is ==> $#"
echo "Your whole patameter is ==> '$@'"
shift
脚本执行结果见下
hanzhou@hanzhou-VirtualBox:~/main/charpter13_learn_shell_script$ bash sh08.sh 1 2 3 4 5 6 7
Total parameter number is ==> 7
Your whole patameter is ==> '1 2 3 4 5 6 7'
Total parameter number is ==> 6
Your whole patameter is ==> '2 3 4 5 6 7'
Total parameter number is ==> 3
Your whole patameter is ==> '5 6 7'
shift n
意为拿掉前n个参数if [条件判断式]; then
当条件判断式成立时,可以进行的命令工作内容;
fi <== 结束if之意
有多个条件要判别时
||代表 or。
多重、复杂条件判断式
if [条件1]; then
执行内容
elif [条件2]; then
执行内容
else
执行内容
fi
其实就是我们所熟知的case when
语法如下:
case $变量名称 in
"第一个变量内容") ##每个变量内容建议用双引号,关键词则为小括号
程序段
;; ##每个类型结尾使用两个连续的分好来处理!
"第二个变量内容")
程序段
;;
*) ##最后一个变量内容都会用*来代表所有其他值
程序段
exit 1
;;
esac
语法如下:
function fname{
程序段
}
fname就是我们的自定义的执行命令名称,而程序段就是我们要它执行的内容。
语法:
while [ condition ]
do
程序段落
done
unitl [ condition ]
do
程序段落
done
for var in con1 con2 con3 ...
do
程序段
done
语法
for (( 初始值; 限制值; 执行步长))
do
程序段
done
sh [-nvx] script.sh
参数