六、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