SHELL編程之基礎(chǔ)知識及變量的定義

原文鏈接:

SHELL編程之基礎(chǔ)知識及變量的定義

在這里插入圖片描述

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ā)的代碼在計算機上運行,就必須找"人"(工具)來翻譯成機器語言,這個"人"(工具)就是我們常常所說的編譯器或者解釋器。

編譯器解釋器.png

1. 編程語言分類

  • 編譯型語言:

? 程序在執(zhí)行之前需要一個專門的編譯過程,把程序編譯成為機器語言文件,運行時不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高,依賴編譯器,跨平臺性差些。如C、C++

  • 解釋型語言:

? 程序不需要編譯,程序在運行時由解釋器翻譯成機器語言,每執(zhí)行一次都要翻譯一次。因此效率比較低。比如Python/JavaScript/ Perl /ruby/Shell等都是解釋型語言。

Shell-Run.png
  • 總結(jié)

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

2. shell簡介

shell-Kernal-User.png

總結(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腳本?

  1. 盡可能記憶更多的命令(記憶命令使用功能和場景)
  2. 掌握腳本的標(biāo)準(zhǔn)的格式(指定魔法字節(jié)、使用標(biāo)準(zhǔn)的執(zhí)行方式運行腳本)
  3. 必須熟悉掌握腳本的基本語法(重點)

(五)學(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í)行方法(不建議)
  1. 直接在命令行指定解釋器執(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:用來查看腳本的語法是否有問題
  1. 使用source命令讀取腳本文件,執(zhí)行文件里的代碼
[root@localhost shell01]# source first_shell.sh
hello world
hello world
hello world

小試牛刀:寫一個木有靈魂的腳本,要求如下:

  1. 刪除/tmp/目錄下的所有文件

  2. 然后在/tmp目錄里創(chuàng)建3個目錄,分別是dir1~dir3

  3. 拷貝/etc/hosts文件到剛創(chuàng)建的dir1目錄里

  4. 最后打印"報告首長,任務(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)文件的順序
    1. /etc/profile
    2. $HOME/.bash_profile
    3. $HOME/.bashrc
    4. /etc/bashrc
    5. $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. 其他變量定義

  • 取出一個目錄下的目錄和文件:dirnamebasename
# 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)變量沒有賦值提示錯誤信息的,沒有賦值功能
在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,715評論 0 5
  • 本文是對Linux shell編程的一個學(xué)習(xí)比較,共包括如下章節(jié)的內(nèi)容: 概述 基本語法 結(jié)構(gòu)化語句 函數(shù) 小結(jié) ...
    我是老薛閱讀 903評論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,648評論 0 0
  • Shell 快速指南 概述 什么是 shell Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux...
    靜默虛空閱讀 761評論 0 5
  • 一,shell題記 不懂shell的程序員不是好程序員,學(xué)習(xí)shell是為了自動化,使用自動化可以非常有效的提高工...
    架構(gòu)師小秘圈閱讀 8,787評論 3 70

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