5、set 、数组
2019-12-26 本文已影响0人
沙砾丶ye
Shell_set用法
set -u
当脚本中遇到未定义的变量时,默认是忽略。
有时候这并不是开发者想要的。
假如有未定义的变量,应该报错,并且终止脚本继续运行。
set -u 就可以办到
#!/usr/bin/env bash
set -u
echo $a
echo shark
执行报如下错误
$ bash set.sh
set.sh: line 13: a: unbound variable
image.png
注意
set -u
a=`ls |grep 'asfdasdf'`
echo "|$a|"
# -u 只针对未定义的变量有效
# 这种情况,变量的值会是一个空字符串
# 所以脚本会继续执行
set -e
set -e 的作用就是:
在脚本执行中,有任何命令的返回值是非 0 的情况,则正在运行的脚本则会退出
设置 -e 之前
[root@kube-master set]# cat set-e-before.sh
#!/bin/sh
foo
echo "继续执行"
执行结果
[root@kube-master set]# sh set-e-before.sh
set-e-before.sh: line 3: foo: command not found
继续执行
设置 -e 之后
解决办法是在脚本中设置 set -e
[root@kube-master set]# cat set-e-after.sh
#!/bin/sh
set -e
foo
echo "继续执行"
执行结果
root@kube-master set]# sh set-e-after.sh
set-e-after.sh: line 5: foo: command not found
但是,对于一组含有管道的命令无效,比如:
#!/usr/bin/env bash
set -e
foo | echo "shark" # 注意这里有管道符
echo "程序会继续运行"
执行结果
[root@kube-master set]# sh set-e.sh
shark
set-e.sh: line 2: foo: command not found # 这是报错信息
程序会继续运行
foo 不是 shell 中的命令,执行会报错,但是其后面有个管道,最终管道后的 echo 命令执行成功了,这种情况下 脚本会继续执行。
解决办法是使用下面的 set -o pipefail
set -o pipefail
要和 set -e 配合使用。
如果设置,如果管道中的所有命令都成功退出,整条命令的返回值才是 0。否则返回非 0。
默认情况下禁用此选项
示例脚本内容
# 设置 set -o pipefail 后,此时脚本就会终止运行
set -e
set -o pipefail
foo |echo ''
echo shark
执行效果
[root@kube-master set]# sh set-e-pipefail.sh
set-e-pipefail.sh: line 4: foo: command not found
Shell_数组
数组 (array) 变量类型
数组中的值: wukong bajie shaseng
值的索引号: 0 1 2
数组的索引只能是 整数
# 定义一个数组
var=(wukong bajie shaseng)
echo ${var[2]} //显示数组中索引号为 2 的值,索引号从 0 开始
输出 shaseng
echo ${var[*]} //显示数组中所有的值
输出 wukong bajie shaseng
定义数组,并且其值从命令的结果中获取
# 把文件中的每一行作为数组中的一个值
line=(`cat /etc/passwd`)
declare 声明关联数组
数组的索引可以是 普通字符串
声明关联数组使用 A 选项
declare -A 数组名称
1. 声明
# 声明关联数组,数组名称为 info
[shark@sharkyun ~]$ declare -A info
2. 添加值
每次添加一个值,可以追加
示例:
[shark@sharkyun ~]$ info[name]=shark
[shark@sharkyun ~]$ info[age]=18
[shark@sharkyun ~]$ echo ${info[name]} # 显示索引对应的值
shark
[shark@sharkyun ~]$ echo ${info[age]}
18
一次添加所以的值,不可以追加,每次都会覆盖上次的值
每个值之间使用 空格 隔开
var=([key1]="value1" [key2]="value2")
示例:
[root@kube-master script]# declare -A color
[root@kube-master script]# color=(["red"]="#ff0000", ["green"]="#00ff00")
[root@kube-master script]# echo ${color[*]}
#ff0000, #00ff00
[root@kube-master script]# color=(["a"]="#ff") # 这样会覆盖原来的值,因为这是在重新定义变量 color
[root@kube-master script]# echo ${color[*]}
#ff
[root@kube-master script]# color=(["b"]="ff")
[root@kube-master script]# echo ${color[*]}
ff
[root@kube-master script]# color[c]="#cc"
[root@kube-master script]# echo ${color[*]}
ff #cc
[root@kube-master script]# echo ${!color[*]} # 获取所有的 索引号
b c
[root@kube-master script]# echo ${#color[*]} # 统计数组中有多少个键值对
2
删除
[root@kube-master arry]# unset info[name]
[root@kube-master arry]# echo ${!info[*]}
age