5、set 、數(shù)組

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

image.png

注意

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容