1 什么是shell script?
shell script是通过shell 的功能所写的一个program,这个程序 是使用纯文本文件,将一些shell的语法与命令写在里面 ,搭配正则式,管道命令和数据流重定向等功能,以达到我们所想要的功能。
2.1 编写第一个script
#!/bin/bash
# this is first shell script
# printf Hello World
echo -e "Hello World \a \n"
exit 0
第一行 #!/bin/bash shen声明使用的是哪一个shell
其余的 # 后面的内容都为注释。
ehco 那一行即为主程序。 这一行的内容是 打印 Hello World。 -e参数代表识别"" 中 需要显示内容的特殊字符。 这里\a 即为发出警告声,\n 为换行。
exit 0为告知程序执行结果,执行完脚本后,可以通过 echo $? 这一句命令来判断上一个命令的执行结果。
2.2 script 的执行方式区别
在命令行下直接执行绝对路径或者相对路径,或者sh script.sh
这种执行方式 script是在子进程的bash内执行。当子进程完成后,子进程内的各项变量或操作将会结束而不会传回父进程。
2 .利用source来执行脚本。
# source script.sh
这个script就会在这个bash 内部生效。这也是为什么不注销系统的时候,修改.bashrc 里面的配置并使其生效的时候,使用source ~/.bashrc 而不是 sh ~/.bashrc。
tset 命令用来检测系统上面某些文件或者是相关的属性。
例如:
test -e ./test .sh && echo “exit”|| echo “not exit”
这句命令是判断test.sh这个文件存不存在,然后再命令行中打印相关结果,如果存在就打印exit,反之就打印not exit。
Test后面接的常用命令解释: test -e file
关于某个文件名的文件类型的判断:
-e 该文件名是否存在、
-f 该文件名是否存在且为文件
-d 该文件名是否存在且为目录
关于文件权限的检测:test -r file
-r 检测该文件名是否存在且具有 可读 权限
-w 检测该文件名是否存在且具有 可写 权限
-x 检测该文件名是否存在且具有 可执行 权限
-s 检测改文件名是否存在且为 非空白文件
两个文件之间的比较:test file1 -nt file2
-nt (newer than)判断文件1 是否比文件2 新。
-ot (older than ) 判断文件1 是否比 文件2 旧。
-ef 判断文件1 和文件2 是否是同一个文件,可用在判断hard link的判定上。 主要是判断两个文件是否指向于同一个inode。
两个整数之间的判断:test n1 -eq n2
-eq 两个数是否相等
-ne 两个数字是否不等
-gt n1 是否大于n2
-lt n1 是否小于n2
-ge n1 是否大于等于n2
-le n1是否小于等于n2
判断字符串的数据:
Test -z string 判断字符串是否为0,如果为空字符串,则为true
Test -n string 判断字符串是否不为0,如果为空字符串,则为false
注意:-n可以省略
Test str1 = str2 判断str1 和str2 是否相等,相等则为true
Test str1 != str2 判断str1 和str2 是否不相等,相等则为false
多重条件判断:
-a 两个条件同时成立。 test -r file -a -x file,当文件同时具有可读和可执行权限的时候,才为true
-o 任意一个条件成立。test -r file -o -x file,当文件同时具有可读或者可执行权限的时候,就为true
! 反向的状态。 test ! -x file 当file不具有x时,则为true。
[ -z “$HOME” ]; echo $?
上面是判断HOME这个变量是否为空。中括号的使用方法和test几乎一样,只是中括号常用于添加判断式中。后面会讲到。
注意事项:
1 在中括号[]里面的每一个组件都要有空格键来隔开。
2 在中括号[]里面的变量都以双引号来括号起来。
3 在中括号[]里面的常量都以双引号或单引号来括号起来。
譬如:
Name = shell sh
[ $NAME == “sh” ] 这是不对的,会报 bash: [: too many argument
上面判断会等于[ shell sh == “sh” ] 一个判断式仅能有两个数据,但是这个判断式有三个数据了。应该 [ “shell sh” == “sh” ]才对。
hyz@ubuntu:~/test$ cat zhongkouhao.sh
#!/bin/bash
# Program:
# show user choice
# History:
# 2019/08/11
read -p "Please Input you choice Y/N:" choice
[ "$choice" == "y" -o "$choice" == 'Y' ] && echo "OK,continue" && exit 0
[ "$choice" == "n" -o "$choice" == 'N' ] && echo "not ok,interrupt" && exit 0
echo "I do not know you choice" && exit 0
上面就是读到控制台的参数,然后进行判断和相关的打印。
Script 针对变量名是已经有设置好一些变量名称了。
/shell/var.sh opt1 opt2 opt3 opt4
$0 &1 &2 &3 &4
特殊变量:
$#: 代表后面接的参数的个数
$@: 代表”$1” ,“$2”, “$3”
$*: 代表 “$1c$2c$3c”,其中c为分隔字符,默认为空格键。
Shift:造成参数变量号码偏移。
hyz@ubuntu:~/test$ cat var.sh
#!/bin/bash
# Program:
# show script name,par and so
# History:
# 2019/08/11
echo "total par numver is : $#"
echo "you whole pa is '$@' "
echo "you whole par is $* "
echo "the firtt numver is $1"
shift
echo "total par numver is : $#"
echo "you whole pa is '$@' "
shift 2
echo "total par numver is : $#"
echo "you whole pa is '$@' "
hyz@ubuntu:~/test$ source var.sh one two three four five
total par numver is : 5
you whole pa is 'one two three four five'
you whole par is one two three four five
the firtt numver is one
total par numver is : 4
you whole pa is 'two three four five'
total par numver is : 2
you whole pa is 'four five'
单层判断式:
if [条件判断]; then
条件成立时的操作
fi
可以将所有条件写入一个中括号里面也可以写入多个中括号用 && 或者|| 来隔开。
[ “$choice” == “Y” -o “$choice” == ‘y’ ]
等同于:
[ “$choice” == “Y” ] || [ “$choice” == ‘y’ ]
多重条件判断式:
if [条件判断1]; then
条件1成立干的事
elif [条件判断2 ]; then
条件1 不成立,条件2成立 做的事
else
条件1 和条件2 都不成立干的事
fi
case $变量名称 in
“第一个变量内容”)
程序段
;;
“第二个变量内容”)
程序段
;;
*)
不包括第一个变量和第二个变量的执行程序段
exit 1;
;;
esac
Function fname(){
程序段
}
因为shell script的执行是由上而下 由左向右,所以function都需要设置在程序的最前面。
另外,Function也是拥有内置变量的,他的内置变量与shell script类似,函数名称代表$0,后续的变量也是以$1 $2 Kauai代替的。
hyz@ubuntu:~/test$ cat funtion.sh
#!/bin/bash
# Program:
# user fucntion print information
# History:
# 2019/08/11
function print(){
echo "you choice is $1"
}
echo "Thsi program will print you selection"
case $1 in
"one")
print 1
;;
"two")
print 2
;;
*)
echo "Usage $0 [one|two]"
;;
esac
hyz@ubuntu:~/test$ source funtion.sh one
Thsi program will print you selection
you choice is 1
hyz@ubuntu:~/test$ source funtion.sh three
Thsi program will print you selection
Usage bash [one|two]
伪代码:
While [conditon]
do
Program
done
当 condition成立的时候就进行循环。
Until [conditon]
do
Program
done
当condition成立的时候终止循环。
for var in con1 con2 con3
do
Program
done
$var 的变量内容在循环工作时一直在改变:
1 第一次循环,$var 为con1
2 第二次循环,$var 为con2
3 第三次循环,$var 为con3
......
for var in $(seq 1 100)
$var的变量的内容是 从1 到100 ,seq是指连续的意思。
另外一种写法:
for ((初始值;限制值;执行步长))
do
Program
done
和c语言类似:
初始值: 某个变量在循环当中的初始值,直接以类似i =1设置好;
限制值: 当变量的值在这个限制值的范围内,就继续进行循环,例如i<100;
执行步长: 没做一次循环,变量的变化值,例如i=i+1;
hyz@ubuntu:~/test$ cat for.sh
#!/bin/bash
# Program:
# printf 1+2+...+n
# History:
# 2019/08/11
read -p "Please input a number,I will cont for 1+2+...+n: " nu
s=0
for (( i=1; i<=$nu; i++ ))
do
s=$(( $s + $i ))
done
echo "The result is $s"
hyz@ubuntu:~/test$ source for.sh
Please input a number,I will cont for 1+2+...+n: 5
The result is 15
hyz@ubuntu:~/test$
# sh [-nvx] script.sh
-n 不要执行script,进查询语法的问题
-v 在执行script的时候,先将script你们的内容输出到屏幕上
-x 将使用到的script内容显示到屏幕上
由sh -x的方式来将命令执行过程也显示出来,如此用户可以判断程序代码执行到哪一段时会出现相关的信息。
感谢linux鸟哥的私房菜。