LinuxStudyNoteBy_Silvers:
(E:\Video_Tutorials\Linux自学视频\linux视频教程)
16:55 2016/2/21
# 什么是shell脚本
Shell除了是命令解释器之外还是一种编程语言,用Shell编写的程序类似于DOS下的批处理程序。
用户可以在文件中存放一系列的命令,通常将Shell编写的程序称为Shell脚本或Shell程序。
将命令、变量和流程控制有机地结合起来将会得到一个功能强大的编程工具。Shell脚本语言非常擅长处理文本类型的数据,由于Linux系统中的所有配置文件都是纯文本的,所以Shell脚本语言在管理Linux系统中发挥了巨大作用。
# 为什么要学习Shell Script
自动化管理
监控管理
日志数据处理
自动数据备份
# Shell脚本中的成分
Shell脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。脚本中所包含的成分主要有:注释、命令、Shell变量和结构控制语句。
注释——注释部分用于对脚本进行解释和说明,在注释行的前面要加上符号#,这样在执行脚本的时候Shell就不会对该行进行解释。
命令——在Shell脚本中可以出现任何在交互下可以使用的命令。
变量——Shell支持字符串变量和整型变量。
结构控制语句——用于编写复杂脚本的流程控制语句。
# Shell脚本的建立与执行
用户可以使用任何文本编辑器编辑Shell脚本文件,如vi,gedit等
对Shell脚本文件的调用可以采用两种方式:
一种是将文件名作为Shell命令的参数,其调用格式为:
$ sh script-file
$ ./script-file
当要被执行脚本文件没有可执行权限时只能使用这种调用方式。
另一种调用方式是先将脚本文件的可访问权限改为可执行,以便该文件可以作为执行文件调用。具体方法是:
$ chmod u+x script-file
当执行一个脚本文件时,Shell就产生一个子Shell(即一个子进程)去执行命令文件中的命令。因此,脚本文件中的变量值不能传递到当前Shell(即父Shell)。
# Shell脚本的编码规范
一个bash脚本的正确起始部分应该以#!开头:
#!/bin/bash
在调用bash的脚本时候,以#!开头的语句通知系统用何种解释器执行此脚本。
如果bash是你的默认shell,那么脚本的开头也不用非得写上#!。但是如果你使用不同的shell来开启一个脚本的话,比如tcsh,那么你就必须需要#!了。良好的shell编码规范还要求以注释形式说明如下的内容:
脚本名称、脚本功能、版权声明、复杂脚本应对算法做简要说明。
# 第一个shell script
#!/bin/bash
# program:
# This program shows "Hello World."
echo -e "Hello World!\a\n"
exit 0
# shell 变量
定义shell变量
name=string
name是变量名,变量名用小写字母命名
= 是赋值符号。两边不能有空格,否则将视为命令
string是被赋值的变量值
例如:
v1=centos
v2='this is a shell script test.'
shell变量表达式
表达式 说明
${#string} $string的长度
${string:position} 从position开始提取字符串
${string:position:length} 从位置$position开始提取长度为$length的子串
${string#substring} 从开头删除最短匹配子串
${stirng##substring} 从开头删除最长匹配子串
${string%substring} 从结尾删除最短匹配子串
${string%%substring} 从结尾删除最长匹配子串
#变量的数值计算
变量的数值计算都是通过(())来计算的。
运算符如下所示:
加、减、乘、除、模、幂运算等
((a=2+3**2-100%5))
echo $a
echo ((a=2+3**2-100%5))
test与[]
标志 说明
-f 文件是否存在
-d 目录是否存在
-r 文件是否有读权限
-w 文件是否有写权限
-x 文件是否有执行权限
test实例
#!/bin/bash
filename=/home/Document
test -f $filename && echo 'exist' || echo 'not exist' #filename文件是否存在?
test -d $filename && echo 'exist' || echo 'not exist' #filename目录是否存在?
test -r $filename && echo 'exist' || echo 'not exist' #filename是否可读?
test -w $filename && echo 'exist' || echo 'not exist' #filename是否可写?
test -x $filename && echo 'exist' || echo 'not exist' #filename是否可执行?
[]判断注意
* 在中括号中必须都要使用空格来分隔
* 在中括号中的变量,最好都要以双引号括起来
* 在中括号中的常数,最好都以单引号括起来。
例如:
[ "$a" == "$b" ] &&echo 'Yes' || echo "No"
[ '12' == '10' ] &&echo'Yes' || echo "No"
[]更多的使用于条件判断
# 单分支判断
if []; then
echo statement
# 双分支判断
if []; then
echo statement
else
echo statement
fi
# 多分支判断
if []; then
echo statement
elif
echo statement
elif
echo statement
fi
case $name in
1);;
esac
#if...elif...fi多分支判断代码示例:
#!/bin/bash
# 多分支判断代码示例1
echo 'Please input your number.'
read number
if [ $number == 1 ];then
echo 'Your input number is 1.'
elif [ $number == 2 ];then
echo 'Your input number is 2.'
elif [ $number == 3 ];then
echo 'Your input number is 3'
else
echo 'I dont know what your input number.'
fi
#!/bin/bash
# 多分支判断语句代码示例2
echo 'Please input your hardware.'
read hd
if [ $hd == cpu ];then
echo 'Your cpu info is'
cat /proc/cpuinfo
elif [ $hd == mem ];then
echo 'Your memory info is'
cat /proc/meminfo
elif [ $hd == hard ];then
echo 'Your harddisk info is'
df -h
else
echo 'I dont know what you input.'
fi
#case;;;esac多分支语句代码示例:
#!/bin/bash
echo 'Please input an number.'
read number
case $number in
1)
echo 'Your input number is 1';;
2)
echo 'Your input number is 2';;
3)
echo 'Your input number is 3';;
*)
echo 'I dont know what your input';;
esac
# shell 脚本中的循环操作
a.
while condition; do
done;
b.
untile condition; do
done;
c.
for(());do
statement
done;
循环操作代码示例:
#!/bin/bash
# [] -eq -ne -gt -ge -lt -le
# (()) == != > >= < <=
# while do 循环代码示例:
i=10
while (($i>=5));do #数值的操作需要双层小括号
echo $i;
((i--));
done;
Shell脚本中多分支,循环条件比较推荐使用中括号来写;小括号只适用于数值的比较及操作
#!/bin/bash
# [] -eq -ne -gt -ge -lt -le
# (()) == != > >= < <=
# while do 循环代码示例:
i=10
while [ $i -gt 5 ];do
echo $i;
((i--));
done;
#until do循环
#!/bin/bash
a=10
until (($a<0));do
echo $a;
((a--));
done;
# while do 和until do 的区别:
while do 条件表达式成立的情况下执行循环体;
until do 条件表达式不成立的情况下执行循环体;
#for循环
#!/bin/bash
for((i=1;i<=10;i++));do
echo $i;
done;
# function 的使用
#!/bin/bash
# Output all information
function print()
{
echo "Your input is $1"
}
echo "This program will priint your selection!"
case $1 in
"one")
print 1;;
"two")
print 2;;
"three")
print 3;;
*)
print "Usage $0 {one|two|three}";;
esac