目錄
2.1. 深入認(rèn)識(shí)變量
2.1.1. 什么是變量
2.1.2. 變量的名稱
2.1.3. 變量的類型
2.1.4. 變量的定義
2.1.5. 自定義變量
2.1.6. 環(huán)境變量
2.1.7. 位置變量
2.2. 變量賦值和作用域
2.2.1. 顯示賦值:變量名=變量值
2.2.2. read 從鍵盤讀入變量值
2.2.3. 變量和引號(hào)
2.2.4. 變量的作用域
2.1. 深入認(rèn)識(shí)變量
2.1.1. 什么是變量
變量是在程序中保存用戶數(shù)據(jù)的一段內(nèi)存存儲(chǔ)空間,變量名是內(nèi)存空間的首地址
2.1.2. 變量的名稱
組成:字母、數(shù)字、下劃線組成,不能以數(shù)字開頭
變量名稱的長(zhǎng)度,shell沒有明確規(guī)定,但是為了增加可讀性,建議使用較短的、見名知意的名稱命名規(guī)則
(1)首字符必須為字母:a-z,A-Z
(2)中間不能由空格,可以使用下劃線(_)
(3)不能使用標(biāo)點(diǎn)符號(hào)
(4)不能使用bash中關(guān)鍵字,輸入help查看bash的保留字
(5)例:下面的變量名都是很好的選擇
[root@server ~]# JAVA_HOME=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64
[root@server ~]# SUM=0
[root@server ~]# back_up=/root
2.1.3. 變量的類型
原則:shell是一種動(dòng)態(tài)類型語言和弱類型語言,變量是不分?jǐn)?shù)據(jù)類型的,統(tǒng)一都使用字符串存儲(chǔ),但根據(jù)變量的上下文環(huán)境,允許程序執(zhí)行一些不同的操作,如:比較、整數(shù)加減
shell的變量數(shù)據(jù)類型
[root@server ~]# vim test1.sh
#!/bin/bash
# 定義變量x,輸入初始值123
x=123
# 變量x加1
let "x+=1"
# 輸出變量x的值
echo "x=$x"
# 替換x中1的值為abc,并賦值給變量y
y=${x/1/abc}
# 使用declare -i 聲明變量y為整型變量(-i 表示整型)
declare -i y
# 輸出y的值
echo "y=$y"
[root@server ~]# bash test1.sh
x=124
y=abc24
2.1.4. 變量的定義
原則:直接使用,不需要變量聲明
格式:變量名=變量的值
例:
[root@server ~]# vim test2.sh
#!/bin/bash
# 定義變量a
a=1
# 定義變量b
b="hello"
# 定義變量c
c="hello world"
# 定義路徑
bak_dir=/data/backup 14
前后不能收空格
[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b =5
bash: b: command not found...
字符串類型建議使用雙引好作為定界符引起,尤其是字符串中有空格
[root@server ~]# stu_name=zhang san
bash: san: command not found...
[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'
2.1.5. 自定義變量
概念:上述以賦值形態(tài)形成的變量定義形式稱為自定義變量
引用變量的值:
(1)$變量名
(2)${表達(dá)式或變量名}
(3)例:
[root@server ~]# a=1024
[root@server ~]# echo $a
1024
[root@server ~]# echo ${a}
1024
查看變量
[root@server ~]# set
[root@server ~]# declare
取消變量:unset 變量名
[root@server ~]# a=256
[root@server ~]# echo $a
256
[root@server ~]# unset a
[root@server ~]# echo $a
作用范圍:只在當(dāng)前shell起效
2.1.6. 環(huán)境變量
環(huán)境變量又稱為全局變量,可以在任意子shell生效,環(huán)境變量又分為自定義環(huán)境變量和bash內(nèi)置的環(huán)境變
量,用戶退出命令后改變量會(huì)丟失,若需要永久保存就必須寫在文件中
定義環(huán)境變量
例:
# 法1
export 環(huán)境變量=值
# 法2
變量名=值
export 變量名
# 法3
declare -x 變量名=值
例
[root@server ~]# export back_dir1=/home/backup
[root@server ~]# NAME="zhang san"
[root@server ~]# export NAME
[root@server ~]# declare -x AGE=20
[root@server ~]# env # 顯示當(dāng)前用戶的環(huán)境變量
[root@server ~]# printenv # 同上
[root@server ~]# export # 同上
注意:以上定義的環(huán)境變量都是臨時(shí)的,重啟后會(huì)失效,若要永久生效,則需要寫入到配置文件中
對(duì)比:
C語言 局部變量 全局變量
shell 自定義變量 環(huán)境變量
shell 環(huán)境變量存儲(chǔ)的文件:
bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、
~/.bashrc、/etc/bashrc
如圖:
/etc/profile :存放一些全局(共有)變量,不管哪個(gè)用戶,登錄時(shí)都會(huì)讀取該文件。通常設(shè)置一些
Shell變量PATH,USER,HOSTNAME和HISTSIZE等
~/.bash_profile:每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件
僅僅執(zhí)行一次,默認(rèn)情況下,此文件通過腳本執(zhí)行同目錄下用戶的.bashrc文件
~/.bashrc:該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開新的shell時(shí),該該
文件被讀取
/etc/bashrc:為每一個(gè)運(yùn)行bash shell的用戶執(zhí)行此文件.當(dāng)bash shell被打開時(shí),該文件被讀取
/etc/inputrc文件為特定的情況處理鍵盤映射
執(zhí)行順序:/etc/profile-->/etc/profile.d/*.sh--> ~/.bash_profile -->/etc/bashrc-->~./.bashrc
結(jié)論:
(1)對(duì)于用戶的環(huán)境變量設(shè)置,常見的是用戶家目錄下的.bashrc和.bash_profile
(2)對(duì)于全局環(huán)境變量設(shè)置,常見的文件有:/etc/profile /etc/bashrc /etc/profile.d 這三個(gè)配
置文件,常用方法是直接在/etc/profile文件中寫入全局變量,如果想要在登陸后初始化或者
顯示加載的內(nèi)容,只需要把腳本文件放在 /etc/profile.d 文件下即可
2.1.7. 位置變量
概念:當(dāng)一條命令或腳本執(zhí)行時(shí),后面可以跟多個(gè)參數(shù),可以使用位置變量來表示該參數(shù)
sh test1.sh hello world 123 456
當(dāng)執(zhí)行test1.sh 腳本時(shí),第一個(gè)參數(shù)為hello到第四個(gè)參數(shù)可以使用特殊的符號(hào)表示,如:$1 $2 $3
……
常見的位置變量
$0 : 腳本名
$1-$9 : 1-9個(gè)參數(shù)
${10} :10以上的參數(shù)需要大花括號(hào)括起
$* : 所有參數(shù)
$@ : 所有參數(shù)
$# : 參數(shù)個(gè)數(shù)
$$ : 當(dāng)前進(jìn)程的PID
$! : 上一個(gè)后臺(tái)進(jìn)程的PID
$? : 上一個(gè)命令的返回值狀態(tài)碼,0為成功
例:
[root@server ~]# vim test3.sh
#!/bin/bash
echo "第2個(gè)位置參數(shù)是: $2"
echo "第1個(gè)位值參數(shù)是: $1"
echo "第4個(gè)位置參數(shù)是: $4"
echo "所有參數(shù)是: $*"
echo "所有參數(shù)是: $@"
echo "參數(shù)的個(gè)數(shù)是: $#"
echo "當(dāng)前進(jìn)程的PID值: $$"
[root@server ~]# bash test3.sh 1 2 3 4 5
第2個(gè)位置參數(shù)是: 2
第1個(gè)位值參數(shù)是: 1
第4個(gè)位置參數(shù)是: 4
所有參數(shù)是: 1 2 3 4 5
所有參數(shù)是: 1 2 3 4 5
參數(shù)的個(gè)數(shù)是: 5
當(dāng)前進(jìn)程的PID值: 1970
[root@server ~]# vim test4.sh
[root@server ~]# bash test4.sh 孫小帥 18 123456@qq.com
name: 孫小帥
age: 18
E-mail:123456@qq.com
$* 與 $@區(qū)別
當(dāng)$* 和 $ @沒有被引用的時(shí)候,它們確實(shí)沒有什么區(qū)別,都會(huì)把位置參數(shù)當(dāng)成一個(gè)個(gè)體, "$*"會(huì)把所有位置參
數(shù)當(dāng)成一個(gè)整體(或者說當(dāng)成一個(gè)單詞),如果沒有位置參數(shù),則"$* "為空,如果有兩個(gè)位置參數(shù)并且IFS為空
格時(shí),"$*"相當(dāng)于"$1 $2"
"$@"會(huì)把所有位置參數(shù)當(dāng)成一個(gè)單獨(dú)的字段,如果沒有位置參數(shù)($#為0),則"$@"展開為空(不是空字符串,
而是空列表),如果存在一個(gè)位置參數(shù),則"$@"相當(dāng)于"$1",如果有兩個(gè)參數(shù),則"$@"相當(dāng)于"$1" "$2"等等
[root@server ~]# set -- I am test command
[root@server ~]# for i in "$@"; do echo $i; done
I
am
test
command
[root@server ~]# for i in "$*"; do echo $i; done
I am test command
2.2. 變量賦值和作用域
2.2.1. 顯示賦值:變量名=變量值
例:
ip1=192.168.1.251
school="Peking University"
today1=`date +%F` # 注意為反引號(hào)``
today2=$(date +%F)
2.2.2. read 從鍵盤讀入變量值
read 命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給 shell 變量
格式:read -參數(shù)變量名
參數(shù)
(1)-p “提示語句:” 屏幕打印出一行提示語句。
(2)-n數(shù)字:當(dāng)輸入的字符數(shù)目達(dá)到預(yù)定數(shù)目時(shí),自動(dòng)退出,并將輸入的數(shù)據(jù)賦值給變量,如:-n1 , 只
要接受到一個(gè)字符就退出。只要按下一個(gè)字符進(jìn)行回答,read命令立即接受輸入并將其傳給變量。無需按回車鍵
(3)-t 等待時(shí)間 :計(jì)時(shí)輸入,使用read命令存在著潛在危險(xiǎn)。腳本很可能會(huì)停下來一直等待用戶的輸
入。如果無論是否輸入數(shù)據(jù)腳本都必須繼續(xù)執(zhí)行,那么可以使用-t選項(xiàng)指定一個(gè)計(jì)時(shí)器。-t選項(xiàng)指定
read命令等待輸入的秒數(shù)。當(dāng)計(jì)時(shí)滿時(shí),read命令返回一個(gè)非零退出狀態(tài)
(4)-s : 關(guān)閉回顯,使read命令中輸入的數(shù)據(jù)不顯示在監(jiān)視器上(實(shí)際上,數(shù)據(jù)是顯示的,只是read命
令將文本顏色設(shè)置成與背景相同的顏色)
(5)常用格式:
read 變量名
read -p "提示信息:" 變量名
例:
[root@server ~]# read -p "Enter Numbers: " num
Enter Numbers: 9527
[root@server ~]# echo $num
9527
[root@server ~]# read -t 3 n1 # 不要輸入內(nèi)容,等待3秒后自動(dòng)結(jié)束輸入
[root@server ~]# read -s -p "Enter your password: " passw
Enter your password: [root@server ~]# echo $passw
123456
[root@server ~]# echo $REPLY
[root@server ~]# read
100
[root@server ~]# echo $REPLY # 當(dāng)輸入時(shí)沒有指定變量接收,會(huì)默認(rèn)存儲(chǔ)到REPLY變量中
100
# 一次性輸入多個(gè)變量的值
[root@server ~]# read t1 t2
12 35
[root@server ~]# echo $t1 $t2
12 35
面試題:總結(jié)4中賦值方式
1.直接賦值:name="li si"
2.read命令: read name
3.使用位置參數(shù)($1 $2 $3…) : name=$1
4.命令輸入:name=$(whoami)
2.2.3. 變量和引號(hào)
雙引號(hào):除了$ 、單引號(hào)、反引號(hào)、反斜線之外,其它被引起的內(nèi)容保持字面意思
單引號(hào):所有字符保持字面意思
反引號(hào):被引起的字符串轉(zhuǎn)為shell命令
反斜線:轉(zhuǎn)義符(\),屏蔽后面字符的特殊含義
2.2.4. 變量的作用域
全局變量:全局變量定義在腳本中,也可以定義在函數(shù)中,作用范圍:從定義的開始處到shell腳本結(jié)束或
者被顯示的去除
例:
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定義函數(shù)
{
echo "$v1"
v1=200
}
v1=100
func
echo "$v1"
[root@server ~]# bash test5.sh
100
200
函數(shù)內(nèi)部定義全局變量
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定義函數(shù)
{
v2=200
}
func
echo "$v2"
[root@server ~]# bash test5.sh
200
局部變量:范圍更小,僅限于某個(gè)程序段中,如:函數(shù)、shell等,通過local關(guān)鍵字定義,注意:函數(shù)的參
數(shù)也是局部變量
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定義函數(shù)
{
local v3=200 # 使用local關(guān)鍵字聲明為局部變量
}
func
echo "$v3"
[root@server ~]# bash test5.sh
全局變量和局部變量區(qū)別
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func()
{
#輸出全局變量v1的值
echo "global variable v1 is $v1"
#定義局部變量v1
local v1=2
#輸出局部變量v1的值
echo "local variable v1 is $v1"
}
#定義全局變量v1
v1=1
#調(diào)用函數(shù)
func
#輸出全局變量v1的值
echo "global variable v1 is $v1"
2.2.5. 變量的運(yùn)算
運(yùn)算符與命令
示例1:
[root@server ~]# expr 1 + 1 # 注意+左右必須要有空格
2
[root@server ~]# expr 1+1 # 否則原樣顯示
1+1
[root@server ~]# a=1
[root@server ~]# b=2
[root@server ~]# expr $a + $b # 支持變量
3
[root@server ~]# let num=1+2 # let+echo 等價(jià)于expr
[root@server ~]# echo $num
3
[root@server ~]# let num=1 + 2 # 注意let中運(yùn)算符左右不能由空格
-bash: let: +:語法錯(cuò)誤: 需要操作數(shù) (錯(cuò)誤符號(hào)是 "+")
[root@server ~]# echo $((1+2))
3
[root@server ~]# echo $((5%3))
2
[root@server ~]# echo $((3%5))
3
[root@server ~]# echo $((1-5))
-4
[root@server ~]# echo $((2 * 5)) # 可以有空格
10
[root@server ~]# echo $((5.2-5)) # 只支持整數(shù)運(yùn)算
-bash: 5.2-5:語法錯(cuò)誤: 無效的算術(shù)運(yùn)算符 (錯(cuò)誤符號(hào)是 ".2-5")
[root@server ~]# echo $[2+3] # [] 等價(jià)于 (())
5
[root@server ~]# echo $[2.5+3] # # 只支持整數(shù)運(yùn)算
-bash: 2.5+3:語法錯(cuò)誤: 無效的算術(shù)運(yùn)算符 (錯(cuò)誤符號(hào)是 ".5+3")
[root@server ~]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software
Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1.1+2
3.1
2.5-3.9
-1.4
1.5>4
0
5>3
1
quit # 退出交互模式
# 不進(jìn)入交互模式直接使用,bc需要放在最后
[root@server ~]# echo "scale=3;11/3" | bc
3.666
# scale=3 表示保留運(yùn)算精度
示例2 :
# 返回變量長(zhǎng)度
[root@server ~]# str1="hello world"
[root@server ~]# echo ${#str1}
11
# 變量截取
[root@server ~]# echo ${str1:0:3} # 從左邊第1個(gè)字符開始截取3個(gè)
hel
[root@server ~]# echo ${str1::3} # 可以省略起始0
hel
[root@server ~]# echo ${str1:1} # 從下標(biāo)1開始截取到尾部
ello world
[root@server ~]# echo ${str1:0-1:1} # 從右邊第一個(gè)字符開始截取1個(gè),左邊第一個(gè)為0,右邊第一個(gè)為0-1
d
[root@server ~]# echo ${str1:0-5} # 從右邊第5個(gè)開始截取到尾部
world
[root@server ~]# echo ${str1: -5} # 使用空格替代0,同上
world
[root@server ~]# echo ${str1:-5} # 沒有空格表示提取整串
hello world
# 使用%截取,刪除右邊字符,保留左邊字符
[root@server ~]# filename=testfile.tar
[root@server ~]# file=${filename%.*} # %.表示從右邊開始檢索第一次出現(xiàn). 之后刪除.右側(cè)的內(nèi)容,保留左邊內(nèi)容,用于對(duì)文件名去掉擴(kuò)展名
[root@server ~]# echo $file
testfile
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%%:*} # %%: 表示從右邊開始檢索最后一次出現(xiàn)的: 之后刪除:右側(cè)的內(nèi)容,保留左邊內(nèi)容
[root@server ~]# echo $ul1
http
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url#*.} # #*.表示左向右遍歷,刪除第一次出現(xiàn)的.左側(cè)內(nèi)容
[root@server ~]# echo $ul1
baidu.com/index.html
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%/*}
[root@server ~]# echo $ul1
http://www.baidu.com
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url##*/}
[root@server ~]# echo $ul1
index.html
特殊擴(kuò)展
-示例:如果parameter變量值為空或未賦值,則返回word字符串的值,注意:parameter變量值不變
[root@server ~]# echo $var1
[root@server ~]# var2=${var1:-hello}
[root@server ~]# echo $var2
hello
-示例:如果parameter變量有值,則返回parameter變量值
[root@server ~]# var2=${var1:-world}
[root@server ~]# echo $var2
hello
=示例:如果parameter變量有值,則返回parameter變量值
[root@server ~]# unset var1 var2
[root@server ~]# var1=hello
[root@server ~]# var2=${var1:=world}
[root@server ~]# echo $var2
hello
?示例:如果parameter變量值為空或未賦值,則word字符串會(huì)作為標(biāo)準(zhǔn)錯(cuò)誤輸出,否則輸出變量的值
[root@server ~]# unset var1 var2
[root@server ~]# var2=${var1:?world}
-bash: var1: world # 標(biāo)準(zhǔn)錯(cuò)誤輸出
[root@server ~]# unset var1 var2
[root@server ~]# var1=hello
[root@server ~]# var2=${var1:?world}
[root@server ~]# echo $var2
hello
+示例:如果parameter變量值為空或未賦值,則什么都不做,否則word字符串將替代變量的值 文章來源:http://www.zghlxwxcb.cn/news/detail-829401.html
[root@server ~]# unset var1 var2
[root@server ~]# var2=${var1:+world}
[root@server ~]# echo $var2
[root@server ~]# unset var1 var2
[root@server ~]# var1=hello
[root@server ~]# var2=${var1:+world}
[root@server ~]# echo $var1 $var2
hello world
面試題:刪除7天前的過期備份數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-829401.html
#!/bin/bash
find ${path:-/tmp} -name "*.tar.gz" -type f mtime +7 | xargs rm -f
# find為查找文件命令
# ${path:-/tmp} :表示如果沒有定義path則使用/tmp替代
# find不支持| 使用xargs命令表示管道符進(jìn)行數(shù)據(jù)轉(zhuǎn)換
到了這里,關(guān)于第二章 變量和引用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!