Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到执行 。
语法:
Shell脚本的第一行必须是如下格式:#!/bin/sh
符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性
注释:
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。如果使用了注释,即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。
变量:
在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明,例:s1(演示)。
#!/bin/sh #set variable a a="hello world" # print a echo "A is:" echo $a
注意:shell会去搜索变量的值,如果这个变量没有值,则就无打印。
默认变量
$# :传入脚本的命令行参数个数
$* :所有命令行参数值,在各个参数值之间留有空格
$0 :命令本身(shell文件名) // ./hello.sh
$1 :第一个命令行参数
$2 :第二个命令行参数
局部变量
在变量首次被赋值时加上 local 关键字可以声明一个局部变量,例:s4(演示):
#!/bin/bash hello="var1" echo $hello function func1 { //定义函数 local hello ="var2" echo $hello } func1 echo $hello
注意:变量
变量赋值时,“=”左右两边都不能有空格
BASH 中的语句结尾不需要分号
if语句 //每一个if对应一个fi
if [ expression ] then #code block fi
if [ expression ]
then
#code block
else
#code block
fi
if [ expression ]
then
#code block
else if [ expression ]
then
#code block
else
#code block
fi
fi
if [ expression ]; then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
fi
逻辑比较
比较操作 整数操作 字符串操作 相同 -eq = 不同 -ne != 大于 -gt > 小于 -lt < 大于或等于 -ge 小于或等于 -le 为空 -z 不为空 -n
比较整数a和b是否相等:if [ $a = $b ] (也可用eq) 判断整数a是否大于整数b:if [ $a -gt $b ] 比较字符串a和b是否相等:if [ $a = $b ] 判断字符串a是否为空: if [ -z $a ] 判断整数变量a是否大于b:if [ $a -gt $b ]
注意:
1. 在“[”和“]”符号的左右都留有空格
2. “=”左右都有空格
文件判断
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
for语句
基本结构是:
for var in [list] do #code block done
其 中 $var 是循环控制变量,[list] 是 var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在do 前面加上 “;”。如: for $var in [list]; do
ex:
#!/bin/bash for day in Sun Mon Tue Wed Thu Fri Sat do echo $day done
注意:1.如果列表被包含在一对双引号中,则被认为是一个元素
2.上面的例子中,在 for 所在那行,变量 day 是没有加 "$" 符号的,而在循环体内,echo 所在行变量$day 是必须加上 "$" 符号的
while循环
基本结构是:
while [ condition ] do #code block done
until循环
基本结构是:
until [ condition ] do #code block done
while 和 until的区别在于while是为真时执行,until是为假时执行
Case语句
BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。
case "$var" in condition1 ) 语句;; condition2 ) 语句;; * ) default statments;; esac
#!/bin/bash echo "Hit a key, then hit return." read Keypress case "$Keypress" in [A-Z] ) echo " Uppercase letter";; [a-z] ) echo " Lowercase letter";; [0-9] ) echo "Digit";; * ) echo "Punctuation, whitespace, or other";; esac