1、shell模块
shell脚本中可以加载配置文件或调用已经完成函数或脚本。
a、加载配置文件
新建配置文件config,插入以下代码:
1 reboot_mode=True
在同一路径下,新建文件module.sh,插入以下代码:
1 #!/bin/bash 2 #可以简写为:. config 3 source config 4 echo "reboot mode is: ${reboot_mode}"
输出:
1 reboot mode is: True
b、使用其它文件中定义的函数
新建文件add.sh,插入以下代码:
1 #!/bin/bash 2 function add(){ 3 x=$1 4 y=$2 5 echo "`expr ${x} + ${y}`" 6 }
在同一路径下module.sh中,插入以下代码:
1 #!/bin/bash 2 #可以简写为:. config 3 source config 4 echo "reboot mode is: ${reboot_mode}" 5 6 #加载add模块 7 . add.sh 8 echo " 1 + 2 result is: $(add 1 2)"
输出:
1 reboot mode is: True 2 1 + 2 result is: 3
2、局部变量和全局变量
1 #局部变量只能在函数中定义,不加local即为全局变量,语法如下: 2 local var_name=val
示例:
1 function say_hi(){ 2 local str1="hi" 3 name=$1 4 echo "${str1},${name},Nice to meet you!" 5 } 6 say_hi "Vicent" 7 8 #在函数外打印name和str1 9 #str1为局部变量,无法在函数外引用 10 echo "val of str1 is: ${str1}" 11 #name为全部变量,输出为Vicent 12 echo "val of name is: ${name}"
输出:
1 hi,Vicent,Nice to meet you! 2 val of str1 is: 3 val of name is: Vicent
3、重定向
重定向分为输入重定向和输出重定向向两种。重定向就是改变标准输入和输出的方向。标准的输入方向为从键盘到程序,标准的输出方向是从程序到屏幕。
为了区别文件,给每个文件分配一个整数,这个就是文件描述符。
- 标准输入的文件名为stdin,文件描述符为0
- 标准输出的文件名为stdout,文件描述符为1
- 标准错误输出文件名为stderr,文件描述符为2
输出重定向是值输出不再是屏幕,一般是文件,这样可以方便保存与查看。
示例1:
1 #命令>文件,以覆盖的方式把命令的正确结果输出到文件中 2 ls -all > a.txt 3 cat a.txt
输出1:
1 总用量 20 2 drwxr-xr-x 2 stephen stephen 4096 4月 4 18:54 . 3 drwxr-xr-x 61 stephen stephen 4096 4月 4 18:15 .. 4 -rw-rw-r-- 1 stephen stephen 69 4月 4 18:25 add.sh 5 -rw-r--r-- 1 stephen stephen 0 4月 4 18:54 a.txt 6 -rw-r--r-- 1 stephen stephen 17 4月 4 18:15 config 7 -rw-rw-r-- 1 stephen stephen 557 4月 4 18:54 module.sh
示例2:
1 #ll命令不存在,所以会报错。以覆盖的方式把标准输出和标准错误输出重定向到文件b.txt中 2 date;ll > b.txt 2>&1 3 cat b.txt
输出2:
1 2019年 04月 04日 星期四 18:59:52 CST 2 module.sh: 行 24: ll: 未找到命令
示例3:
1 #ll命令不存在,所以会报错 2 #ll命令不存在,所以会报错。以追加的方式把标准输出和标准错误输出重定向到文件b.txt中 3 date > b.txt 4 date;ll >> b.txt 2>&1 5 cat b.txt
输出3:
1 2019年 04月 04日 星期四 19:04:00 CST 2 2019年 04月 04日 星期四 19:04:00 CST 3 module.sh: 行 27: ll: 未找到命令
4、声明变量类型
1 #用来设置变量的属性,语法如下: 2 declare [+/-] [aAfFgilprtux] [name=val] 3 #+设置属性,取消属性 ,i表示整数 r表示只读变量等
示例1:
1 declare -i m=1 2 echo ${m}
输出1:
1 1
示例2:
1 declare -i n="Hello" 2 echo ${b}
输出2:
1 0
5、read和位置参数
示例1:
1 #用来从标准输出中读取数据并赋值 2 #示例 3 read -t 20 -sp "Please input your password : " passwd 4 if [ ${passwd} = "123456" ] ;then 5 echo "login sucess." 6 else 7 echo "login fail." 8 fi
- -t, 超时时间,单位为s
- -s,静默模式,屏幕上不显示输入
- -p,显示提示信息
输出1:
1 Please input your password : login sucess.
位置参数
示例2:
插入以下代码并保存为module.sh
1 echo "First arg is: $1" 2 echo "Second arge is :$2" 3 echo "All args is : $*" 4 echo "Total args num is:$#
输出2:
1 First arg is: Hello 2 Second arge is :World 3 All args is : Hello World 4 Total args num is:2
6、shell调试
使用-x参数调试shell脚本,通过-x可以看到运行过程中变量取值与运行情况。
示例1:
以下代码保存到test.sh中
1 #!/bin/bash 2 function say_hi(){ 3 local str1="hi" 4 declare -i name
name=$1 5 echo "${str1},${name},Nice to meet you!" 6 } 7 say_hi "Vicent"
调试脚本test.sh
1 /bin/bash -x test.sh
预期输出为:
1 hi,Vicent,Nice to meet you!
实际输出1:
1 + say_hi Vicent 123 2 + local str1=hi 3 + declare -i name=Vicent 4 + echo 'hi,0,Nice to meet you!' 5 hi,0,Nice to meet you
通过 -x打印出来的信息可以看到name变量为强制声明为整数,所以把字符串装换成了数字0。