原文鏈接:
SHELL編程之基礎(chǔ)知識及變量的定義
SHELL編程涉及的知識面很廣,要想系統(tǒng)的學(xué)習(xí)SHELL編程,我們需要一步一步地走,堅持下去定會有收獲。
-
① Shell的基本語法結(jié)構(gòu)
如:變量定義、條件判斷、循環(huán)語句(for、until、while)、分支語句、函數(shù)和數(shù)組等;
② 基本正則表達(dá)式的運用;
③ 文件處理三劍客:grep、sed、awk工具的使用;
④ 使用shell腳本完成一些較復(fù)雜的任務(wù),如:服務(wù)搭建、批量處理等。
-
本篇目標(biāo)
- 熟練掌握shell變量的定義和獲?。ㄖ攸c)
- 能夠進(jìn)行shell簡單的四則運算
一、SHELL介紹
前言:
計算機只能識別機器語言(0和1),如(11000000 這種)。但是,我們的程序猿們不能直接去寫01這樣的代碼,所以,要想將程序猿所開發(fā)的代碼在計算機上運行,就必須找"人"(工具)來翻譯成機器語言,這個"人"(工具)就是我們常常所說的編譯器或者解釋器。

1. 編程語言分類
- 編譯型語言:
? 程序在執(zhí)行之前需要一個專門的編譯過程,把程序編譯成為機器語言文件,運行時不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高,依賴編譯器,跨平臺性差些。如C、C++
- 解釋型語言:
? 程序不需要編譯,程序在運行時由解釋器翻譯成機器語言,每執(zhí)行一次都要翻譯一次。因此效率比較低。比如Python/JavaScript/ Perl /ruby/Shell等都是解釋型語言。

- 總結(jié)
編譯型語言比解釋型語言速度較快,但是不如解釋型語言跨平臺性好。如果做底層開發(fā)或者大型應(yīng)用程序或者操作系開發(fā)一般都用編譯型語言;如果是一些服務(wù)器腳本及一些輔助的接口,對速度要求不高、對各個平臺的兼容性有要求的話則一般都用解釋型語言。
2. shell簡介

總結(jié):
- shell就是人機交互的一個橋梁,位于用戶與操作系統(tǒng)內(nèi)核之間,并且包裹在操作系統(tǒng)的外面。
- shell的種類
[root@localhost zhangjm]# cat /etc/shells
/bin/sh #是bash的一個快捷方式
/bin/bash #bash是大多數(shù)Linux默認(rèn)的shell,包含的功能幾乎可以涵蓋shell所有的功能
/sbin/nologin #表示非交互,不能登錄操作系統(tǒng)
/bin/dash #小巧,高效,功能相比少一些
/bin/tcsh #是csh的增強版,完全兼容csh
/bin/csh #具有C語言風(fēng)格的一種shell,具有許多特性,但也有一些缺陷
思考:終端和shell有什么關(guān)系?
terminal意思是終端,終端包括PC上的鍵盤、鼠標(biāo)等設(shè)備,舉個例子:linux上面的terminal(對的,就是你輸入指令的那個黑色框框)就是一個仿真終端,你可以把它當(dāng)作一個模擬的輸入設(shè)備。
而shell是殼程序,shell其實就是一個解釋器,它負(fù)責(zé)接收你的輸入,通過它可以與操作系統(tǒng)交互,你在終端輸入的指令就是被shell接收的。shell是包裹在操作系統(tǒng)外層的一道程序,就好像是操作系統(tǒng)的殼,shell(殼)的名稱也由此而來。
3. shell腳本
(一)什么是shell腳本?
- 一句話概括
簡單來說就是將需要執(zhí)行的命令保存到文本中,按照順序執(zhí)行。它是解釋型的,意味著不需要編譯。
- 準(zhǔn)確敘述
若干命令 + 腳本的基本格式 + 腳本特定語法 + 思想= shell腳本
(二)什么時候用到腳本?
重復(fù)化、復(fù)雜化的工作,通過把工作的命令寫成腳本,以后僅僅需要執(zhí)行腳本就能完成這些工作。
(三)shell腳本能干啥?
①自動化軟件部署 LAMP/LNMP/Tomcat...
②自動化管理 系統(tǒng)初始化腳本、批量更改主機密碼、推送公鑰...
③自動化分析處理 統(tǒng)計網(wǎng)站訪問量
④自動化備份 數(shù)據(jù)庫備份、日志轉(zhuǎn)儲...
⑤自動化監(jiān)控腳本
(四)如何學(xué)習(xí)shell腳本?
- 盡可能記憶更多的命令(記憶命令使用功能和場景)
- 掌握腳本的標(biāo)準(zhǔn)的格式(指定魔法字節(jié)、使用標(biāo)準(zhǔn)的執(zhí)行方式運行腳本)
- 必須熟悉掌握腳本的基本語法(重點)
(五)學(xué)習(xí)shell腳本的秘訣
多看(看懂)——>模仿(多練)——>多思考(多寫)
(六)shell腳本的基本寫法
1)腳本第一行,魔法字符#!指定解釋器【必寫】
#!/bin/bash 表示以下內(nèi)容使用bash解釋器解析
注意:
如果直接將解釋器路徑寫死在腳本里,可能在某些系統(tǒng)就會存在找不到解釋器的兼容性問題,所以可以使用:#!/bin/env 解釋器
2)腳本第二部分,注釋(#號)說明,對腳本的基本信息進(jìn)行描述【可選】
#!/bin/env bash
# 以下內(nèi)容是對腳本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路徑
# Usage:用法
# Update:更新時間
#下面就是腳本的具體內(nèi)容
commands
...
3)腳本第三部分,腳本要實現(xiàn)的具體代碼內(nèi)容
(七)shell腳本的執(zhí)行方法
- 標(biāo)準(zhǔn)腳本執(zhí)行方法(建議)
1) 編寫人生第一個shell腳本
[root@localhost tmp]# vim first_shell.sh
[root@localhost tmp]# cat first_shell.sh
#!/bin/env bash
#name: 名字
# Desc:描述describe
# Path:存放路徑
# Usage:用法
# Update:更新時間
#下面就是腳本的具體內(nèi)容
echo "hello world"
echo "hello world"
2) 腳本增加可執(zhí)行權(quán)限
[root@localhost tmp]# chmod +x first_shell.sh
3) 標(biāo)準(zhǔn)方式執(zhí)行腳本
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# /tmp/first_shell.sh
hello world
hello world
[root@localhost tmp]# ./first_shell.sh
hello world
hello world
注意:標(biāo)準(zhǔn)執(zhí)行方式腳本必須要有可執(zhí)行權(quán)限。
- 非標(biāo)準(zhǔn)的執(zhí)行方法(不建議)
- 直接在命令行指定解釋器執(zhí)行
[root@localhost shell01]# bash first_shell.sh
[root@localhost shell01]# sh first_shell.sh
[root@localhost shell01]# bash -x first_shell.sh
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
+ echo 'hello world'
hello world
-x:一般用于排錯,查看腳本的執(zhí)行過程
-n:用來查看腳本的語法是否有問題
- 使用
source命令讀取腳本文件,執(zhí)行文件里的代碼
[root@localhost shell01]# source first_shell.sh
hello world
hello world
hello world
小試牛刀:寫一個木有靈魂的腳本,要求如下:
刪除/tmp/目錄下的所有文件
然后在/tmp目錄里創(chuàng)建3個目錄,分別是dir1~dir3
拷貝/etc/hosts文件到剛創(chuàng)建的dir1目錄里
-
最后打印"報告首長,任務(wù)已于2019-05-05 10:10:10時間完成"內(nèi)容
echo "報告首長,任務(wù)已于$(date +'%F %T')"
[root@localhost shell]# cat test.sh
#!/bin/env bash
rm -rf /tmp/*
mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
cp /etc/hosts /tmp/dir1
echo "The project has been finished at $(date +%F)"
二、變量的定義
1. 變量是什么?
一句話概括:變量是用來臨時保存數(shù)據(jù)的,該數(shù)據(jù)是可以變化的數(shù)據(jù)。
2. 什么時候需要定義變量?
- 如果某個內(nèi)容需要多次使用,并且在代碼中重復(fù)出現(xiàn),那么可以用變量代表該內(nèi)容。這樣在修改內(nèi)容的時候,僅僅需要修改變量的值。
- 在代碼運作的過程中,可能會把某些命令的執(zhí)行結(jié)果保存起來,后續(xù)代碼需要使用這些結(jié)果,就可以直接使用這個變量。
3.變量如何定義?
變量名=變量值
變量名:用來臨時保存數(shù)據(jù)的
變量值:就是臨時的可變化的數(shù)據(jù)
[root@localhost ~]# A=hello 定義變量A
[root@localhost ~]# echo $A 調(diào)用變量A,要給錢的,不是人民幣是美元"$"
hello
[root@localhost ~]# echo ${A} 還可以這樣調(diào)用,不管你的姿勢多優(yōu)雅,總之要給錢
hello
[root@localhost ~]# A=world 因為是變量所以可以變,移情別戀是常事
[root@localhost ~]# echo $A 不管你是誰,只要調(diào)用就要給錢
world
[root@localhost ~]# unset A 不跟你玩了,取消變量
[root@localhost ~]# echo $A 從此,我單身了,你可以給我介紹任何人
4. 變量的定義規(guī)則
雖然可以給變量(變量名)賦予任何值;但是,對于變量名也是要求的!:unamused:
(一) 變量名區(qū)分大小寫
[root@localhost ~]# A="hello"
[root@localhost ~]# a="world"
[root@localhost ~]# echo $A
hello
[root@localhost ~]# echo $a
world
(二) 變量名不能有特殊符號
[root@localhost ~]# *A="HELLO WORLD"
bash: *A=HELLO WORLD: command not found
[root@localhost ~]# ?A="hello"
bash: ?A=hello: command not found
[root@localhost ~]# 2A="hello hello"
bash: 2A=hello hello: command not found
[root@localhost ~]# A2="hello hello"
[root@localhost ~]# echo $A2
hello hello
特別說明:對于有空格的字符串給變量賦值時,要用引號引起來
注意:不能以數(shù)字開頭并不代表變量名中不能包含數(shù)字呦。
(三)變量名不能以數(shù)字開頭
(四) 等號兩邊不能有任何空格
[root@localhost ~]# A =123
-bash: A: command not found
[root@localhost ~]# A= 123
-bash: 123: command not found
[root@localhost ~]# A = 123
-bash: A: command not found
[root@localhost ~]# A=123
[root@localhost ~]# echo $A
123
(五) 變量名盡量做到見名知意
NTP_IP=10.1.1.1
DIR=/u01/app1
TMP_FILE=/var/log/1.log
...
說明:一般變量名使用大寫(小寫也可以),不要同一個腳本中變量全是a,b,c等不容易閱讀
5. 變量的定義方式有哪些?
(一) 基本方式
直接賦值給一個變量
[root@localhost ~]# A=1234567
[root@localhost ~]# echo $A
1234567
[root@localhost ~]# echo ${A:3:4} 表示從A變量中第3個字符開始截取,截取4個字符
4567
說明:
$變量名 和 ${變量名}的異同
相同點:都可以調(diào)用變量
不同點:${變量名}可以只截取變量的一部分,而$變量名不可以
(二) 命令執(zhí)行結(jié)果賦值給變量
[root@localhost ~]# B=`date +%F`
[root@localhost ~]# echo $B
2020-03-07
[root@localhost ~]# C=$(uname -r)
[root@localhost ~]# echo $C
2.6.32-754.el6.x86_64
交互式定義變量(read)
目的:讓用戶自己給變量賦值,比較靈活。
語法:read [選項] 變量名
常見選項:
| 選項 | 釋義 |
|---|---|
| -p | 定義提示用戶的信息 |
| -n | 定義字符數(shù)(限制變量值的長度) |
| -s | 不顯示(不顯示用戶輸入的內(nèi)容) |
| -t | 定義超時時間,默認(rèn)單位為秒(限制用戶輸入變量值的超時時間) |
舉例說明:
用法1:用戶自己定義變量值
[root@localhost ~]# read name
JingYu
[root@localhost ~]# echo $name
JingYu
[root@localhost ~]# read -p "Input weChat name:" name
Input weChat name:JingYu
[root@localhost ~]# echo $name
JingYu
用法2:變量值來自文件
[root@localhost ~]# vi 1.txt
[root@localhost ~]# cat 1.txt
10.1.1.1 255.255.255.1
[root@localhost ~]# read ip mask < 1.txt
[root@localhost ~]# echo $ip
10.1.1.1
[root@localhost ~]# echo $mask
255.255.255.1
(四) 定義有類型的變量(declare)
目的:給變量做一些限制,固定變量的類型,比如:整型、只讀
用法:declare 選項 變量名=變量值
常用選項:
| 選項 | 釋義 | 舉例 |
|---|---|---|
| -i | 將變量看成整數(shù) | declare -i A=123 |
| -r | 定義只讀變量 | declare -r B=hello |
| -a | 定義普通數(shù)組;查看普通數(shù)組 | |
| -A | 定義關(guān)聯(lián)數(shù)組;查看關(guān)聯(lián)數(shù)組 | |
| -x | 將變量通過環(huán)境導(dǎo)出 | declare -x AAA=123456 等于 export AAA=123456 |
舉例說明:
[root@localhost ~]# A=JingYu
[root@localhost ~]# declare -i A=666
[root@localhost ~]# echo $A
666
[root@localhost ~]# A=JingYu
[root@localhost ~]# echo $A
0
[root@localhost ~]# declare -r B=JingYu
bash: declare: B: readonly variable
[root@localhost ~]# unset B
bash: unset: B: cannot unset: readonly variable
[root@localhost ~]# B=Beijing
bash: B: readonly variable
6. 變量的分類
(一) 本地變量
- 本地變量:當(dāng)前用戶自定義的變量。當(dāng)前進(jìn)程中有效,其他進(jìn)程及當(dāng)前進(jìn)程的子進(jìn)程無效。
(二) 環(huán)境變量
-
環(huán)境變量:當(dāng)前進(jìn)程有效,并且能夠被子進(jìn)程調(diào)用。
-
env查看當(dāng)前用戶的環(huán)境變量 -
set查詢當(dāng)前用戶的所有變量(臨時變量與環(huán)境變量) -
export 變量名=變量值或者變量名=變量值;export 變量名
-
[zhangjm@localhost ~]$ export A="JingYu" 臨時將一個本地變量(臨時變量)變成環(huán)境變量
[zhangjm@localhost ~]$ env | grep ^A env查看當(dāng)前用戶的環(huán)境變量,grep ^A 過濾出以字母A開頭的行
A=JingYu
永久生效:
vim /etc/profile 或者 ~/.bashrc
export A=hello
或者
A=hello
export A
說明:系統(tǒng)中有一個變量PATH,環(huán)境變量
export PATH=/usr/local/mysql/bin:$PATH
(三) 全局變量
全局變量:全局所有的用戶和程序都能調(diào)用,且繼承,新建的用戶也默認(rèn)能調(diào)用.
解讀相關(guān)配置文件
| 文件名 | 說明 | 備注 |
|---|---|---|
| $HOME/.bashrc | 當(dāng)前用戶的bash信息,用戶登錄時讀取 | 定義別名、umask、函數(shù)等 |
| $HOME/.bash_profile | 當(dāng)前用戶的環(huán)境變量,用戶登錄時讀取 | |
| $HOME/.bash_logout | 當(dāng)前用戶退出當(dāng)前shell時最后讀取 | 定義用戶退出時執(zhí)行的程序等 |
| /etc/bashrc | 全局的bash信息,所有用戶都生效 | |
| /etc/profile | 全局環(huán)境變量信息 | 系統(tǒng)和所有用戶都生效 |
| $HOME/.bash_history | 用戶的歷史命令 | history -w 保存歷史記錄 history -c 清空歷史記錄 |
說明:以上文件修改后,都需要重新source讓其生效或者退出重新登錄。
-
用戶登錄系統(tǒng)讀取相關(guān)文件的順序
/etc/profile$HOME/.bash_profile$HOME/.bashrc/etc/bashrc$HOME/.bash_logout
(四) 系統(tǒng)變量
- 系統(tǒng)變量(內(nèi)置bash中變量) : shell本身已經(jīng)固定好了它的名字和作用.
| 內(nèi)置變量 | 含義 |
|---|---|
| $? | 上一條命令執(zhí)行后返回的狀態(tài);狀態(tài)值為0表示執(zhí)行正常,非0表示執(zhí)行異?;蝈e誤 |
| $0 | 當(dāng)前執(zhí)行的程序或腳本名 |
| $# | 腳本后面接的參數(shù)的個數(shù) |
| $* | 腳本后面所有參數(shù),參數(shù)當(dāng)成一個整體輸出,每一個變量參數(shù)之間以空格隔開 |
| $@ | 腳本后面所有參數(shù),參數(shù)是獨立的,也是全部輸出 |
| $1~$9 | 腳本后面的位置參數(shù),$1表示第1個位置參數(shù),依次類推 |
| ${10}~${n} | 擴展位置參數(shù),第10個位置變量必須用{}大括號括起來(2位數(shù)字以上擴起來) |
| $$ | 當(dāng)前所在進(jìn)程的進(jìn)程號,如echo $$
|
| $! | 后臺運行的最后一個進(jìn)程號 (當(dāng)前終端) |
| !$ | 調(diào)用最后一條命令歷史中的參數(shù) |
- 進(jìn)一步了解位置參數(shù)
$1~${n}
#!/bin/bash
#了解shell內(nèi)置變量中的位置參數(shù)含義
echo "\$0 = $0"
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$11 = ${11}"
echo "\$12 = ${12}"
- 進(jìn)一步了解$*和?$@的區(qū)別
$*:表示將變量看成一個整體
$@:表示變量是獨立的
[root@localhost zhangjm]# vi test.sh
[root@localhost zhangjm]# chmod +x test.sh
[root@localhost zhangjm]# ./test.sh hello Jing Yu
hello
Jing
Yu
---------------
hello Jing Yu
[root@localhost zhangjm]# cat test.sh
#!/bin/env bash
for i in "$@"
do
echo $i
done
echo "---------------"
for i in "$*"
do
echo $i
done
三、簡單四則運算
算術(shù)運算:默認(rèn)情況下,shell就只能支持簡單的整數(shù)運算
運算內(nèi)容:加(+)、減(-)、乘(*)、除(/)、求余數(shù)(%)
1. 四則運算符號
| 表達(dá)式 | 舉例 |
|---|---|
| $(( )) | echo $((1+1)) |
| $[ ] | echo $[10-5] |
| expr | expr 10 / 5 |
| let | n=1;let n+=1 等價于 let n=n+1 |
2.了解i++和++i
- 對變量的值的影響
[root@localhost zhangjm]# i=1
[root@localhost zhangjm]# let i++
[root@localhost zhangjm]# echo $i
2
[root@localhost zhangjm]# j=1
[root@localhost zhangjm]# let ++j
[root@localhost zhangjm]# echo $j
2
- 對表達(dá)式的值的影響
[root@localhost zhangjm]# unset i j
[root@localhost zhangjm]# i=1;j=1
[root@localhost zhangjm]# let x=i++ 先賦值,后運算
[root@localhost zhangjm]# let y=++j 先運算,后賦值
[root@localhost zhangjm]# echo $i
2
[root@localhost zhangjm]# echo $j
2
[root@localhost zhangjm]# echo $x
1
[root@localhost zhangjm]# echo $y
2
四、擴展補充
1. 數(shù)組定義
(一) 數(shù)組分類
- 普通數(shù)組:只能使用整數(shù)作為數(shù)組索引(元素的下標(biāo))
- 關(guān)聯(lián)數(shù)組:可以使用字符串作為數(shù)組索引(元素的下標(biāo))
(二) 普通數(shù)組定義
- 一次賦予一個值
數(shù)組名[索引下標(biāo)]=值
root@localhost zhangjm]# array[0]=v1
[root@localhost zhangjm]# array[1]=v2
[root@localhost zhangjm]# array[2]=v3
[root@localhost zhangjm]# echo ${array[0]}
v1
- 一次賦予多個值
數(shù)組名=(值1 值2 值3 ...)
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`) 將文件中每一行賦值給array1數(shù)組
array2=(`ls /root`)
array3=(harry amy jack "Miss Hou")
array4=(1 2 3 4 "hello world" [10]=linux)
(三) 數(shù)組的讀取
${數(shù)組名[元素下標(biāo)]}
echo ${array[0]} 獲取數(shù)組里第一個元素
echo ${array[*]} 獲取數(shù)組里的所有元素
echo ${#array[*]} 獲取數(shù)組里所有元素個數(shù)
echo ${!array[@]} 獲取數(shù)組元素的索引下標(biāo)
echo ${array[@]:1:2} 訪問指定的元素;1代表從下標(biāo)為1的元素開始獲??;2代表獲取后面幾個元素
查看普通數(shù)組信息:
[root@localhost ~]# declare -a
(四) 關(guān)聯(lián)數(shù)組定義
①首先聲明關(guān)聯(lián)數(shù)組
declare -A asso_array1
declare -A asso_array2
declare -A asso_array3
② 數(shù)組賦值
- 一次賦一個值
數(shù)組名[索引or下標(biāo)]=變量值
# asso_array1[linux]=one
# asso_array1[java]=two
# asso_array1[php]=three
- 一次賦多個值
[root@localhost zhangjm]# declare -A asso_array2
[root@localhost zhangjm]# asso_array2=([linux]=one [Jing]=Yu [Hello]=World)
[root@localhost zhangjm]# echo ${asso_array[linux]}
one
[root@localhost zhangjm]# echo ${asso_array[*]}
World Yu one
[root@localhost zhangjm]# echo ${#asso_array[*]}
3
[root@localhost zhangjm]# echo ${!asso_array[*]}
Hello Jing linux
- 查看關(guān)聯(lián)數(shù)組
# declare -A
declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss Hou" )'
- 獲取關(guān)聯(lián)數(shù)組值
# echo ${asso_array1[linux]}
one
# echo ${asso_array1[php]}
three
# echo ${asso_array1[*]}
three two one
# echo ${!asso_array1[*]}
php java linux
# echo ${#asso_array1[*]}
3
# echo ${#asso_array2[*]}
4
# echo ${!asso_array2[*]}
name3 name2 name1 name4
- 其他定義方式
[root@localhost shell05]# declare -A books
[root@localhost shell05]# let books[linux]++
[root@localhost shell05]# declare -A|grep books
declare -A books='([linux]="1" )'
[root@localhost shell05]# let books[linux]++
[root@localhost shell05]# declare -A|grep books
declare -A books='([linux]="2" )'
2. 其他變量定義
- 取出一個目錄下的目錄和文件:
dirname和basename
# A=/root/Desktop/shell/mem.txt
# echo $A
/root/Desktop/shell/mem.txt
# dirname $A 取出目錄
/root/Desktop/shell
# basename $A 取出文件
mem.txt
- 變量"內(nèi)容"的刪除和替換
一個“%”代表從右往左去掉一個/key/
兩個“%%”代表從右往左最大去掉/key/
一個“#”代表從左往右去掉一個/key/
兩個“##”代表從左往右最大去掉/key/
舉例說明:
[root@localhost ~]# url="www.jingyu.org"
[root@localhost ~]# echo ${#url}
14
[root@localhost ~]# echo ${url#.}
www.jingyu.org
[root@localhost ~]# echo ${url##*.}
org
[root@localhost ~]# echo ${url%.*}
www.jingyu
[root@localhost ~]# echo ${url%%.*}
www
- 以下了解,自己完成
替換:/ 和 //
1015 echo ${url/ao/AO}
1017 echo ${url//ao/AO} 貪婪替換
替代: - 和 :- +和:+
1019 echo ${abc-123}
1020 abc=hello
1021 echo ${abc-444}
1022 echo $abc
1024 abc=
1025 echo ${abc-222}
${變量名-新的變量值} 或者 ${變量名=新的變量值}
變量沒有被賦值:會使用“新的變量值“ 替代
變量有被賦值(包括空值): 不會被替代
1062 echo ${ABC:-123}
1063 ABC=HELLO
1064 echo ${ABC:-123}
1065 ABC=
1066 echo ${ABC:-123}
${變量名:-新的變量值} 或者 ${變量名:=新的變量值}
變量沒有被賦值或者賦空值:會使用“新的變量值“ 替代
變量有被賦值: 不會被替代
1116 echo ${abc=123}
1118 echo ${abc:=123}
[root@localhost ~]# unset abc
[root@localhost ~]# echo ${abc:+123}
[root@localhost ~]# abc=hello
[root@localhost ~]# echo ${abc:+123}
123
[root@localhost ~]# abc=
[root@localhost ~]# echo ${abc:+123}
${變量名+新的變量值}
變量沒有被賦值或者賦空值:不會使用“新的變量值“ 替代
變量有被賦值: 會被替代
[root@localhost ~]# unset abc
[root@localhost ~]# echo ${abc+123}
[root@localhost ~]# abc=hello
[root@localhost ~]# echo ${abc+123}
123
[root@localhost ~]# abc=
[root@localhost ~]# echo ${abc+123}
123
${變量名:+新的變量值}
變量沒有被賦值:不會使用“新的變量值“ 替代
變量有被賦值(包括空值): 會被替代
[root@localhost ~]# unset abc
[root@localhost ~]# echo ${abc?123}
-bash: abc: 123
[root@localhost ~]# abc=hello
[root@localhost ~]# echo ${abc?123}
hello
[root@localhost ~]# abc=
[root@localhost ~]# echo ${abc?123}
${變量名?新的變量值}
變量沒有被賦值:提示錯誤信息
變量被賦值(包括空值):不會使用“新的變量值“ 替代
[root@localhost ~]# unset abc
[root@localhost ~]# echo ${abc:?123}
-bash: abc: 123
[root@localhost ~]# abc=hello
[root@localhost ~]# echo ${abc:?123}
hello
[root@localhost ~]# abc=
[root@localhost ~]# echo ${abc:?123}
-bash: abc: 123
${變量名:?新的變量值}
變量沒有被賦值或者賦空值時:提示錯誤信息
變量被賦值:不會使用“新的變量值“ 替代
說明:?主要是當(dāng)變量沒有賦值提示錯誤信息的,沒有賦值功能