6.1 注释

shell编程的注释以字符“#”开头,相当于VB中的'和类C语言中的//

6.2 开始

6.2.1开始的时候必须告诉系统启动一个shell脚本,才能开始添加命令。
e.g. #!/bin/bash

6.2.2 变量的赋值使用运算符“=”。使用变量的时候要再变量名的前面加上符号“$”。变量类型只是文本字符,系统不会自动辨认为数字。
e.g.
var=1
var=$var+1
echo $var
输出结果是1+1不是2

6.2.3 特殊变量
?:表示前一个命令的退出状态
$:表示当前系统进程的PID
-:当前shell启动的时候调用的选项
!:在后台运行的上一命令的PID
o:当前脚本文件名
1-9 :调用当前脚本的时候给出的第1-9个命令行参数

6.3 流程控制

6.3.1 条件流程
#!/bin/bash
read color
if [ $color = "purple" ]
then
echo "purple"
elif [ $color = "blue" ]
echo "blue"
else
echo "none"
fi

6.3.2 test命令

test命令用于计算条件的值,包含很多选项,可以用于计算所有条件类型。
e.g.
if ( test $color = "purple" )=if [ $color="purple" ]
if ( test -e filename )=if [ -e filename ]

-d:指定目录存在
-e:指定文件存在
-f:指定文件存在并且是普通文件
-G:文件所有者ID和文件ID相匹配
-nt:前一个文件比后一个文件新 file1 -nt file2
-ot:前一个文件比后一个文件旧
-O:执行命令用户是文件所有者
-r:执行命令用户对文件有读取权限
-s:指定文件存在并且不为空
-w:执行命令用户对文件有写入权限
-x:执行命令用户对文件有执行权限

6.3.3 比较运算符
!=不等于
=等于
>大于
<小于
大于和小于的比较在于文本字符串的比较,a大于b,b大于c

6.3.4 多条件逻辑
和C,C#,JAVA一样,"||"表示逻辑或,"&&"表示逻辑与

6.3.5 数学运算
expr命令可以实现数学运算
e.g.
m=1
m=expr m + 1
但对*的使用要用转义符\
\*

6.3.6 case
e.g.
case "$a" in
a)
echo "a"
;;
*
echo "none"
exit 1
;;
esac

6.3.7 循环
1.while [] do done 2.until [] do done
e.g.
while [ $color != "blue" ]
do
echo "incorrect"
read $color
done

until和while的条件相反

6.4 进阶

6.4.1 输入和输出重定向

>:把STDOUT重定向到一个文件
<:把STDIN重定向到一个文件
>>:把STDOUT追加到一个文件尾
|:从一个程序或进程中获取输出并发送到另一个程序或进程

6.4.2 命令替换

命令替换就是将命令保存在一个变量中。
格式 1.var="..." 2. var='...' 3.var=$()
使用第三中圆括号扩展可以实现命令镶套

6.4.3 修改环境变量和shell变量
export命令用于修改shell环境
e.g. export name=value

6.5 函数

普通函数调用示例
#!/bin/bash
repeat()
{
echo "$1,$2"
}
repeat oh no

镶套调用示例
#!/bin/bash
num1()
{
echo "wait.."
num2
}
num2()
{
echo "ok"
}
num1

变量作用域:与普通的高级语言不同,函数中声明的变量是全局变量。如果要声明局部变量要使用关键字local
local myvar=1

函数库:用点号"."可以包含函数文件。这些函数文件中包括若干函数,实现程序的模块结构化和复用。
. ~/lib/scope

6.6 getopts

该命令用于检查传递给命令行的参数是否有效
语法:getopts optstring name
getopts通过两个变量跟踪所有事情
OPTIND:保存下一个需要处理的参数的索引
OPTARG:如需一个参数,就放到这个变量中
大多数情况,getpots用于在某些类型的循环中检查传递给脚本的选项和参数
e.g.
while getopts "xy:z" name
do
echo "$name" $OPTIND $OPTARG
done
运行 ~/bin/get.sh -xy "one" -z "two"
结果
x 1
y 3 one
z 5 two