Loading

shell高级特性-4

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、重定向

 重定向分为输入重定向和输出重定向向两种。重定向就是改变标准输入和输出的方向。标准的输入方向为从键盘到程序,标准的输出方向是从程序到屏幕。

为了区别文件,给每个文件分配一个整数,这个就是文件描述符。

  1. 标准输入的文件名为stdin,文件描述符为0
  2. 标准输出的文件名为stdout,文件描述符为1
  3. 标准错误输出文件名为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。

posted @ 2019-04-04 20:15  秦无殇  阅读(324)  评论(0编辑  收藏  举报