六、set的使用和数组

2019-12-20  本文已影响0人  胖虎喜欢小红

set

set -u

当脚本中遇到未定义的变量时,默认是忽略。
有时候这并不是开发者想要的。
假如有未定义的变量,应该报错,并且终止脚本继续运行。
set -u 就可以办到
set -u //空字符串会继续执行

#!/usr/bin/bash
                                    //空字符串 set -u 会继续执行

echo $a
echo hello
[root@biudefor jiaoben]# bash set.sh 

hello
--------------------------- 我是一条分割线
#!/usr/bin/bash
set -u

echo $a
echo hello
[root@biudefor jiaoben]# bash set.sh 
set.sh: line 4: a: unbound variable

注意

set -u

a=`ls |grep 'asfdasdf'`
echo "|$a|"

# -u  只针对未定义的变量有效
# 这种情况,变量的值会是一个空字符串
# 所以脚本会继续执行

set -e

set -e 的作用就是:
在脚本执行中,有任何命令的返回值是非 0 的情况,则正在运行的脚本则会退出。

#!/usr/bin/bash

haha
echo hello
[root@biudefor jiaoben]# bash set.sh               //默认脚本中出现错误命令会继续执行
set.sh: line 3: haha: command not found
hello

--------------------------- 我是一条分割线

#!/usr/bin/bash
set -e

haha
echo hello
[root@biudefor jiaoben]# bash set.sh             //设置了set -e后,一报错就停止脚本运行
set.sh: line 4: haha: command not found

但是,对于一组含有管道的命令无效,比如:

#!/usr/bin/env bash
set -e
foo | echo "hello"    # 注意这里有管道符
echo  "程序会继续运行"

解决办法

set -o pipefail

需要和 set -e 配合使用。
如果设置,如果管道中的所有命令都成功退出,整条命令的返回值才是 0。否则返回非 0。
默认情况下禁用此选项

#!/usr/bin/bash
set -e
set -o pipefile

haha | grep hello
echo hello

[root@biudefor jiaoben]# bash set.sh 
set.sh: line 3: set: pipefile: invalid option name

数组

数组中的值: wukong  bajie  shaseng
值的索引号: 0    1     2

数组的索引只能是 整数

[root@biudefor jiaoben]# a=(1 2 3)             //()定义数组
[root@biudefor jiaoben]# echo ${a[2]}          //读取数组里的值 ${数组名[索引]}
3
[root@biudefor jiaoben]# echo ${a[*]}          //*和@ 列出所有的值
1 2 3

定义数组,并且其值从命令的结果中获取

# 把文件中的每一行作为数组中的一个值
[root@biudefor jiaoben]# line=(`cat /etc/passwd`)
[root@biudefor jiaoben]# a=($(cat /etc/passwd))

declare 声明关联数组

数组的索引可以是 普通字符串
声明关联数组使用 A 选项

declare -A  数组名称

[root@biudefor jiaoben]# declare -A d

2. 添加值

- 每次添加一个值,可以追加
数组名[索引]=值
[root@biudefor jiaoben]# d[1]=hello
[root@biudefor jiaoben]# echo ${d[1]}
hello
[root@biudefor jiaoben]# d[2]=hi
[root@biudefor jiaoben]# echo ${d[2]}
hi
[root@biudefor jiaoben]# echo ${d[*]}
hello hi
- 一次添加所以的值,不可以追加,每次都会覆盖上次的值

每个值之间使用空格隔开

[root@biudefor jiaoben]# d=(["3"]="dog" ["4"]="cat")
[root@biudefor jiaoben]# echo ${d[*]}
dog cat
[root@biudefor jiaoben]# echo ${d[3]}
dog
上一篇下一篇

猜你喜欢

热点阅读