看了很长时间,终于看到Shell Script了。加油吧!
Linux系统服务(services)的接口都放在/etc/init.d这个目录下,这个目录下的文件都是scripts。
编写第1个Shell Script 还是从“Hello World”开始吧
1、第一行的 #!/bin/bash 表示这个script使用的是bash。
2、最后一行的 exit 0 表示这个script结束后返回一个返回值为0
第2个Shell Script 希望做一个可以和用户交互的Shell,用户输入firstname和lastname,然后script返回fullname。
第3个Shell Script 通过用户输入用户名,并根据date命令获得的日期,然后用touch命令创建文件。
filename=${fileuser:-"filename"} 的写法之前用过,将filename变量 设置值为fileuser 如果fileuser为空或者不存在则使用:-后面的filename默认值来给filename变量赋值。
第4个 Shell Script 用户输入两个数字,对两个数字进行计算。
变量定义为整形以后才可以进行计算。可以使用declare -i num来进行定义。
也可以直接使用 total=$(($num1*$num2))来进行计算 $((计算内容))计算数值。
第5个 Shell Script。用户输入一个文件名,用test命令来判断文件是否存在并输出文件的权限。
第6个 Shell Script 提示用户输入Y/N,根据用户输入的内容判断输出。
由于输入的内容可能是大写或者小写,因此这里使用 -o 来连接(或的意思)。
第7个 Shell Script,在shell后面添加输入参数。
- $0 代表script名称
- $# 代表script名称后面接的参数个数
- $@ 代表("$1" "$2" "$3") 每个参数独立的用双引号括起来
- $* 代表("$1c$2c$3") ,c为分隔符,默认为空格,代表意思为"$1 $2 $2"
-lt 2 表示小于2
第8个 Shell Script 在sh07的基础上进行修改,了解shift 偏移参数的功能
通过执行结果可以知道,shift 可以将参数向后偏移,也可以在shift后面接数字,来选择偏移的参数数量.
Shell Script 条件判断,if... then
- 单层,简单的判断
if [ 条件 ] then
满足条件执行的内容
fi <== if 反过来
&& 表示 and
|| 表示 or
下面把sh06.sh 改为用if then的方式
- 多重,重复的条件判断
第9个 Shell Script ,根据输入的参数做出提示。
第10个 Shell Script 通过netstat -tuln | grep 来查看系统开启的端口,并输出信息.
第11个 Shell Script 通过用户输入一个日期,计算还有多长时间退伍。
其中 echo $date2 | grep '[0-9]\{8\}' 判断输入的是否是八位数字
$()的作用和反引号` `的作用相同,都是将括起来的内容当作命令来执行,并将结果返回。
第12个 Shell Script 用case in 语句 修改sh09.sh实现相同功能
case 语句的用法
case $变量名称 in
"第一个变量内容") //第一个变量内容+右括号
第一个执行内容
;;//以;;两个分号结尾
"第二个变量内容")//第二个变量内容+右括号
第二段执行内容
;;//以;;两个分号结尾
*)//剩余内容以*) 星号加上右括号
剩余的执行内容
;;//以;;两个分号结尾
esac//以esac结尾,就是将case反过来写。
第13个 Shell Script 用$1作为 case 的输入变量 代替使用 read
利用function功能
function fname(){
执行内容
}
由于Shell Script 中的执行顺序是从上到下,从左到右的,因此定义的方法要写在前面。
下面将Sh12.sh修改一下 定义个function
第14个 Shell Script function中的$1 和 Shell Script 并非同一个
运行以后可以发现输出的结果是 Your choice is 1 并非输入的one。
loop 循环
while do done,until do done。
while [ condition ] 当满足condition时执行循环
do //程序开始
执行内容
done //程序结束
until [ condition ]当不满足condition时执行循环
do //程序开始
执行内容
done //程序结束
第15个Shell Script 使用while 执行循环,直到用户输入yes/YES时退出
第16个Shell Script 使用until执行循环,直到用户输入yes/YES时退出
可以比较15 和 16的差异。注意15种 while [ ]的判断使用的是 -a 表示and而 16中使用的是-o表示or
第17个 Shell Script 计算1+2+3+...+100的结果并输出
第18个 Shell Script 将上一个Shell 稍微改造一下,根据用户输入的数字计算1+2+..+n,并输出结果
for...do...done(固定循环)
for var in con1 con2 con3 ...
do
程序段
done
就上面的例子,第一次循环时,$var 内容是 con1
第二次循环时,$var 内容是 con2
第三次循环时,$var 内容是con3
下面来个简单的练习。
第19个 Shell Script 简单的for使用
输出结果为:
第20个 Shell Script 根据/etc/passwd 检查用户登陆信息等
cut -d(分割) -f1(取到第一个字段)
第21个 Shell Script 通过ping 命令查看网络状态
其中ping 命令中 -c 1 表示发送1个包后停止; -w 1表示等待最多1毫秒。
1. 标准输入stdin文件描述符为0,标准输出stdout文件描述符为1,标准错误stderr文件描述符为2
2. /dev/null 空设备,相当于垃圾桶
& > 等同于 2>&1 将标准输出和标准错误重定向到, >等同于 1 >将标准输出重定向到
&> 不影响前面 ping 命令的返回结果,因此当ping 成功时 result=0,ping 失败时 result=1
第22个 Shell Script 用户输入一个目录名称,打印出目录下的文件权限
执行结果如下
第23个 Shell Script for do done 的另外一种用法,计算1+2+3...+n
for((初始值;限制值;执行步阶))
do
循环内容
done
这样的循环方式和java中的 for(;;)非常像。
Shell Script 的追踪与Debug
sh -[nvx] scripts.sh
-n: 不执行script 只查询语法错误
-v: 在执行script前先将script内容 输出到屏幕上
-x: 将使用到的script内容显示在屏幕上。
Shell Script执行方式的差异(source,sh script,./script)
- 利用直接执行的方式来执行。
此时将会使用一个新的bash环境,在新的bash中定义的变量在父bash环境中没有定义,并且在子程序结束后,子程序的bash环境会销毁。
例如在上面sh02.sh中
$firstname 和$lastname 都输出为空,没有定义。
- 利用source来执行:在父程序中执行
如果用source来执行的话,效果就不一样了。
我们可以看到$firstname 和 $lastname生效了,因为他们是在当前的bash环境中执行的。
这也就是我们在不注销系统而让设置生效可以使用source ~/.bashrc而不能使用 bash ~/.bashrc的原因。