Shell_set用法
set -u
當(dāng)腳本中遇到未定義的變量時(shí),默認(rèn)是忽略。
有時(shí)候這并不是開發(fā)者想要的。
假如有未定義的變量,應(yīng)該報(bào)錯(cuò),并且終止腳本繼續(xù)運(yùn)行。
set -u 就可以辦到
#!/usr/bin/env bash
set -u
echo $a
echo shark
執(zhí)行報(bào)如下錯(cuò)誤
$ bash set.sh
set.sh: line 13: a: unbound variable

注意
set -u
a=`ls |grep 'asfdasdf'`
echo "|$a|"
# -u 只針對(duì)未定義的變量有效
# 這種情況,變量的值會(huì)是一個(gè)空字符串
# 所以腳本會(huì)繼續(xù)執(zhí)行
set -e
set -e 的作用就是:
在腳本執(zhí)行中,有任何命令的返回值是非 0 的情況,則正在運(yùn)行的腳本則會(huì)退出
設(shè)置 -e 之前
[root@kube-master set]# cat set-e-before.sh
#!/bin/sh
foo
echo "繼續(xù)執(zhí)行"
執(zhí)行結(jié)果
[root@kube-master set]# sh set-e-before.sh
set-e-before.sh: line 3: foo: command not found
繼續(xù)執(zhí)行
設(shè)置 -e 之后
解決辦法是在腳本中設(shè)置 set -e
[root@kube-master set]# cat set-e-after.sh
#!/bin/sh
set -e
foo
echo "繼續(xù)執(zhí)行"
執(zhí)行結(jié)果
root@kube-master set]# sh set-e-after.sh
set-e-after.sh: line 5: foo: command not found
但是,對(duì)于一組含有管道的命令無效,比如:
#!/usr/bin/env bash
set -e
foo | echo "shark" # 注意這里有管道符
echo "程序會(huì)繼續(xù)運(yùn)行"
執(zhí)行結(jié)果
[root@kube-master set]# sh set-e.sh
shark
set-e.sh: line 2: foo: command not found # 這是報(bào)錯(cuò)信息
程序會(huì)繼續(xù)運(yùn)行
foo 不是 shell 中的命令,執(zhí)行會(huì)報(bào)錯(cuò),但是其后面有個(gè)管道,最終管道后的 echo 命令執(zhí)行成功了,這種情況下 腳本會(huì)繼續(xù)執(zhí)行。
解決辦法是使用下面的 set -o pipefail
set -o pipefail
要和 set -e 配合使用。
如果設(shè)置,如果管道中的所有命令都成功退出,整條命令的返回值才是 0。否則返回非 0。
默認(rèn)情況下禁用此選項(xiàng)
示例腳本內(nèi)容
# 設(shè)置 set -o pipefail 后,此時(shí)腳本就會(huì)終止運(yùn)行
set -e
set -o pipefail
foo |echo ''
echo shark
執(zhí)行效果
[root@kube-master set]# sh set-e-pipefail.sh
set-e-pipefail.sh: line 4: foo: command not found
Shell_數(shù)組
數(shù)組 (array) 變量類型
數(shù)組中的值: wukong bajie shaseng
值的索引號(hào): 0 1 2
數(shù)組的索引只能是 整數(shù)
# 定義一個(gè)數(shù)組
var=(wukong bajie shaseng)
echo ${var[2]} //顯示數(shù)組中索引號(hào)為 2 的值,索引號(hào)從 0 開始
輸出 shaseng
echo ${var[*]} //顯示數(shù)組中所有的值
輸出 wukong bajie shaseng
定義數(shù)組,并且其值從命令的結(jié)果中獲取
# 把文件中的每一行作為數(shù)組中的一個(gè)值
line=(`cat /etc/passwd`)
declare 聲明關(guān)聯(lián)數(shù)組
數(shù)組的索引可以是 普通字符串
聲明關(guān)聯(lián)數(shù)組使用 A 選項(xiàng)
declare -A 數(shù)組名稱
1. 聲明
# 聲明關(guān)聯(lián)數(shù)組,數(shù)組名稱為 info
[shark@sharkyun ~]$ declare -A info
2. 添加值
每次添加一個(gè)值,可以追加
示例:
[shark@sharkyun ~]$ info[name]=shark
[shark@sharkyun ~]$ info[age]=18
[shark@sharkyun ~]$ echo ${info[name]} # 顯示索引對(duì)應(yīng)的值
shark
[shark@sharkyun ~]$ echo ${info[age]}
18
一次添加所以的值,不可以追加,每次都會(huì)覆蓋上次的值
每個(gè)值之間使用 空格 隔開
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") # 這樣會(huì)覆蓋原來的值,因?yàn)檫@是在重新定義變量 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[*]} # 獲取所有的 索引號(hào)
b c
[root@kube-master script]# echo ${#color[*]} # 統(tǒng)計(jì)數(shù)組中有多少個(gè)鍵值對(duì)
2
刪除
[root@kube-master arry]# unset info[name]
[root@kube-master arry]# echo ${!info[*]}
age