1. Shell文件的扩展名不要求,约定写成.sh
2. Shell脚本文件的第一行一般为 :
#!/bin/bash
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
3. 执行Shell脚本程序的两种方式
1> chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2> /bin/bash test.sh #直接运行解释器,其参数就是shell脚本的文件名
4. 定义和使用变量
定义变量:variableName="value" #变量与等号之间不能有空格,首个字符必须为字母,
不能使用bash里面的关键字。
使用变量:$ variableName #在变量名字之前加美元符号,推荐所有的变量都是用
{}花括号帮助解释器识别变量的边界。
5. 字符串操作
字符串可以用单引号,也可以用双引号,也可以不用引号。
1> 单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
2> 双引号的优点:
双引号里可以有变量;
双引号里可以出现转义字符。
3> 拼接字符串:{$str 1} {$str2} #将str1和str2拼接在一起
4> 获取字符串长度:${#str} #获取字符串str的长度
5> 提取字符串:${str:i:n} #获取字符串str从第i个字符之后的n个字符的
子字符串
6. Shell数组
1> 定义数组:在Shell中,用括号来表示数组,下标从0开始 ,数组元素用“空格”符号分割开。定义数组的一般形式为:数组名=(值1 值2... 值n)
2> 读取数组:${数组名[下标]} --> ${arrayName[6]}
读取数组中的所有元素 :${arrayName[@]}
3> 获取数组长度: ${#arrayName[@]} 或 ${#arrayName[*]}
获取数组中单个数组的长度:${#arrayName[i]}
7. Shell echo指令
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。
1> 显示字符串:echo “It is a test”
2> 显示结果定向到文件:echo “It is a test” > myfile
3> 显示命令执行结果:echo date
8. Shell test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件方面的测试。
1> 数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
基本格式: test ${num1} -eq ${num2}
2> 字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串长度伪则为真
-n 字符串 字符串长度不伪则为真
基本格式: test num1=num2
3> 文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
基本格式:test -e file
4> Shell还提供了与(! )、或( -o )、非( -a )三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。
9. Shell if else 语句
Sh的流程控制不能为空,如果else分支没有语句执行,就不要写这个else。
1> if else格式
if condition
then
command1
command2
…
commandn
else
command
fi
2> if else-if else格式
if condition1
then
command
elif condition2
command2
else
commandn
fi
3> if else语句经常与test命令结合使用,也就是说test命令一般作为if的condition
4>
10. Shell case 语句
case语句格式如下:
case 值 in
模式1)
command1
…
commandn
;;
模式2)
command1
…
commandn
;;
esac
取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
11. Shell for循环
for循环一般格式为:
for变量名 in列表
do
command1
...
commandn
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。
12. Shell while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。
其格式为:
while 命令
do
command1
command2
...
commandn
done
13. Shelluntil循环
until循环执行一系列命令直至条件为真时停止。
其格式为:
until 条件
command1
command2
...
command
done
14. Shellbreak和continue命令
break命令允许跳出所有循环(终止执行后面的所有循环);
ontinue命令不会跳出所有循环,仅仅跳出当前循环。
15. read 命令
从标准输入中读取数据至变量中。
例:read value #读取标准输入值至变量
echo ${value} #使用读取的变量
16. Shell函数
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。
函数的定义格式如下:
函数名( ) {
command1
command2
...
commandN
}
如果愿意,可在函数名前加上关键字function,这取决于使用者。
function 函数名( ) {
command1
command2
...
commandN
[ return value ]
}
函数返回值,可以显示增加return语句;如果不加,则将最后一条命令运行结果作为返回值。函数返回值在调用该函数后通过 $? 来获得。
17. Shell函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。
$1表示第一个参数,$2表示第二个参数...;
当n>=10时,需要使用${n}来获取参数;
还有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
例:function_name arg1 arg2……