shell 腳本語言的變量用法示例詳解
1、變量
變量表示命名的內存空間,將數據放在內存空間中,通過變量名引用,獲取數據
2、 變量類型
變量類型:
- 內置變量:如PS1,PATH,UID,HOSTNAME,HISTSIZE
- 用戶自定義變量
- 預定義變量
- 位置變量
不同的變量存放的數據不同,決定了以下:
- 數據存儲方式
- 參與的計算
- 表示的數據范圍
變量數據類型:
- 字符串
- 數值:整型,浮點型(小數)、bash不支持浮點數
3、 Shell中變量命名法則
- 不能使用程序中的保留字,如:if,for
- 只能使用數字,字母及下劃線,且不能以數字開頭
- 見名思意,用英文名字,并體現真正含義
- 統(tǒng)一命名規(guī)則:駝峰命名法(比如:varName)
- 全局變量名大寫
- 局部變量小寫
- 函數名小寫
4、 變量定義和引用
變量的生效范圍(變量作用域)
- 普通變量(局部):生效范圍為當前shell進程;對當前shell之外的其他shell進程,包括當前shell的子shell進程均無效
- 環(huán)境變量(全局):生效范圍為當前shell進程及其子進程
- 本地變量(局部):生效范圍為當前shell進程中某代碼片段,通常指函數
變量賦值:
name="value"? value可以是以下多種類型 直接字符串:name='root' 變量引用:name="$USER" 命令應用:name=`command` || name=$(command) 通配符:FILE=/etc/* /*表示etc目錄下所有的文件名*/
注意:變量賦值是臨時生效,當退出終端后,變量會自動刪除,無法持久保存。
變量引用:
$name
${name}弱引用和強引用:
- “$name”:弱引用,其中的變量引用會被替換成為變量值
- ‘$name’:強引用,其中的變量引用不會被替換成變量值,而保持原字符串
實例:
[root@localhost ~]# name='Mike' [root@localhost ~]# NAME="$USER" [root@localhost ~]# hostname=`hostname` [root@localhost ~]# echo "My name is $name" My name is Mike [root@localhost ~]# echo "My name is $NAME" My name is root [root@localhost ~]# echo "My hostname is $hostname" My hostname is localhost.localdomain [root@localhost ~]# ? [root@localhost ~]# NUM=`seq 10` [root@localhost ~]# echo $NUM 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# echo "$NUM" 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]#
查看已定義的所有變量:
[root@localhost ~]#set
刪除變量
[root@localhost ~]#unset shellname1 shellname2 //實例: [root@localhost ~]# echo $name Mike [root@localhost ~]# unset name [root@localhost ~]# echo $name ? [root@localhost ~]#
實例:"{}"的使用
[root@localhost ~]# NAME=mage
[root@localhost ~]# AGE=20
[root@localhost ~]# echo $NAME
mage
[root@localhost ~]# echo $AGE
20
[root@localhost ~]# echo $NAME $AGE
mage 20
[root@localhost ~]# echo $NAME_$AGE
20
[root@localhost ~]# echo ${NAME}_$AGE
mage_20
[root@localhost ~]# 顯示系統(tǒng)信息
[root@localhost ~]# vim shell/OS.sh
#!/bin/bash
RED="\E[1;31m"
GREEB="\E[1;32m"
END="\E[0m"
echo -e "\E[1;32m----------Host systeminfo----------$END"
echo -e "HOSTNAME: $RED `hostname`$END"
echo -e "IPADDR: $RED `ifconfig ens160 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -n1` $END"
echo -e "OSVERSION: $RED `cat /etc/redhat-release`$END"
echo -e "KERNEL: $RED `uname -r`$END"
echo -e "CPU: $RED `lscpu | grep "型號名稱:" | tr -s ' ' ' '|cut -d ' ' -f 2-5` $END"
echo -e "MEMORY: $RED `free -h | grep Mem | tr -s ' ' ' '|cut -d ' ' -f 4` $END"
echo -e "DISK: $RED `lsblk | grep '^sda' | tr -s ' ' | cut -d ' ' -f 4` $END"
echo -e "\E[1;32m---------- END ----------$END"
[root@localhost ~]# chmod +x shell/OS.sh
[root@localhost shellScript]# ./os.sh
----------Host systeminfo----------
HOSTNAME: localhost.localdomain
IPADDR: 192.168.115.213
OSVERSION: CentOS Linux release 7.9.2009 (Core)
KERNEL: 3.10.0-1160.el7.x86_64
CPU: 11th Gen Intel(R) Core(TM)
MEMORY: 1.0G
DISK: 200G
---------- END ----------利用變量實現動態(tài)命令
[root@localhost ~]# CMD=hostname [root@localhost ~]# $CMD localhost.localdomain [root@localhost ~]#
5、 環(huán)境變量
環(huán)境變量:
- 可以使子進程(包括孫子進程)繼承父進程的變量,但是無法讓父進程使用子進程的變量。
- 一旦子進程修改了從父進程繼承的變量,將會傳遞新的值給孫子進程
- 一般只在配置文件中使用,在腳本中較少使用
課程引入:普通變量生效的范圍與環(huán)境變量生效的范圍
[root@localhost ~]# vim shell/father.sh #!/bin/bash NAME=father echo "father.sh:NAME=$NAME" echo "fatther is PID=$BASHPID" shell/son.sh ? [root@localhost ~]#vim shell/son.sh #!/bin/bash echo "son.sh:NAME=$NAME" NAME=son echo "son.sh:NAME=$NAME" echo "son.sh PID is $BASHPID" echo "son.sh father pid is $PPID" sleep 100 ? [root@localhost ~]#chmod -R +x shell/* ? [root@localhost ~]# ./shell/father.sh father.sh:NAME=father fatther is PID=12053 son.sh:NAME= son.sh:NAME=son son.sh PID is 12054 son.sh father pid is 12053 ? #子進程無法使用父進程的變量,需要自己賦值
變量聲明和賦值:
export name=VALUE declare -x name =VALUE #或者先賦值再聲明~ value可以是以下多種類型 直接字符串:name='root' 變量引用:name="$USER" 命令應用:name=`command` || name=$(command) 通配符:FILE=/etc/* /*表示etc目錄下所有的文件名*/
declare命令詳解:(了解)
declare 為 shell 指令,在第一種語法中可用來聲明變量并設置變量的屬性([rix]即為變量的屬性),在第二種語法中可用來顯示 shell 函數。若不加上任何參數,則會顯示全部的 shell 變量與函數(與執(zhí)行 set 指令的效果相同)
語法
declare [+/-][rxi][變量名稱=設置值] 或 declare -f
參數說明:
- +/- "-“可用來指定變量的屬性,”+"則是取消變量所設的屬性。
- -f 僅顯示函數
- r 將變量聲明為只讀變量。注意,一旦設置為只讀變量,既不能修改變量的值也不能刪除變量,甚至不能通過+r取消只 讀屬性
- x 指定的變量會成為環(huán)境變量,可供shell以外的程序來使用
- i 將變量聲明為整數型(integer)
- p 顯示指定變量的被聲明類型。
實例
1.聲明整數型變量
#!/bin/bash declare -i ab //聲明整數型變量 ab=56 //改變變量內容 echo $ab //顯示變量內容 ? ---> 56
2.改變變量屬性
#!/bin/bash #聲明整數型變量 declare -i ef ef=1 echo $ef #變量賦值,賦予文本值 ef="wer" echo $ef #取消變量屬性 declare +i ef ef="wer" echo $ef
3.設置變量只讀
#!/bin/bash declare -r ab #設置變量為只讀 ab=88 #改變變量內容 echo $ab #顯示變量內容 ? ---> declare.sh:行3: ab: 只讀變量
4.聲明數組變量
#!/bin/bash
#聲明數組變量
declare -a cd
cd[0]=a
cd[1]=b
cd[2]=c
#輸出數組的指定內容
echo ${cd[1]}
#顯示整個數組變量內容
echo ${cd[@]}5.顯示函數
#!/bin/bash
#聲明函數
declare -f
function command_not_found_handle(){
if [ -x /usr/lib/command_not_found_handle ];then
/usr/bin/python /usr/lib/command_not_found_handle -- $1;
return $?;
else
if [ -x /usr/share/command_not_found_handle ];then
/usr/bin/python /usr/share/command_not_found_handle --$1;
return $?;
else
return 127;
fi;
fi;
}變量引用:
$name
${name}完善課程導入:
[root@localhost ~]# vim shell/father.sh #!/bin/bash NAME=father export NAME echo "father.sh:NAME=$NAME" echo "fatther is PID=$BASHPID" shell/son.sh ? [root@localhost ~]#vim shell/son.sh #!/bin/bash echo "son.sh:NAME=$NAME" NAME=son echo "son.sh:NAME=$NAME" echo "son.sh PID is $BASHPID" echo "son.sh father pid is $PPID" sleep 100 ? [root@localhost ~]#chmod -R +x shell/* ? [root@localhost ~]# ./shell/father.sh father.sh:NAME=father fatther is PID=12053 son.sh:NAME=father son.sh:NAME=son son.sh PID is 12054 son.sh father pid is 12053 [root@localhost ~]# ./shell/father.sh father.sh:NAME=father fatther is PID=12142 son.sh:NAME=father son.sh:NAME=son son.sh PID is 12143 son.sh father pid is 12142 #父進程定義了一個環(huán)境變量,在子進程上可以進行調用 #父進程無法使用子進程的變量 #子進程自己定義了一個同名變量,就覆蓋環(huán)境變量
顯示所有環(huán)境變量:
[root@localhost ~]# env [root@localhost ~]# printenv [root@localhost ~]# export [root@localhost ~]# declare -x
刪除變量:
[root@localhost ~]#unset shellname1 shellname2
Bash內建的環(huán)境變量
PATH SHELL USER UID PWD SHLVL #shell的嵌套層數,即深度 LANG MAIL HOSTNAME HISTSIZE _ #下劃線,表示前一命令的最后一個參數
6、只讀變量
只讀變量:只能聲明定義,但后續(xù)不能修改和刪除
- 聲明只讀變量:
readonly name declare -r name
- 查看只讀變量:
readonly [-p] declare -r
7、位置與預定義變量
位置變量:在Bash Shell中內置的變量,在腳本代碼中調用命令行傳遞給腳本的參數
$1,$2,... 對應第一個,第二個等參數,shift[n]換位置,最多9個 #預定義變量 $0 腳本本身,包括路徑 $* 傳遞給腳本的所有參數,全部參數合成一個字符串 $@ 傳遞給腳本的所有參數,每個參數為獨立字符串 $# 傳遞給腳本的參數的個數 $? 上個命令的退出狀態(tài),或函數的返回值 $$ 當前shell進程ID。對于Shell腳本,就是這些腳本所在的進程ID ? 注意:$@,$*只有被雙引號括起來的時候才會有差異
清空所有位置變量
set -- //寫在腳本內部
實例演示1:
[root@localhost ~]# vim ARG.sh
#!/bin/bash
echo "1st arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
echo "4st arg is $4"
echo "The number of are is $#"
echo "All args are $*"
echo "All args are $@"
echo "The scriptname is `basename $0`"
[root@localhost ~]# chmod +x shell/ARG.sh
[root@localhost ~]# shell/ARG.sh {1..10}
1st arg is 1
2st arg is 2
3st arg is 3
4st arg is 4
The number of are is 10
All args are 1 2 3 4 5 6 7 8 9 10
All args are 1 2 3 4 5 6 7 8 9 10
The scriptname is ARG.sh
[root@localhost ~]# 實例演示2:編寫一個移動文件腳本
[root@localhost ~]# vim move.sh
#!/bin/bash
WANGING_COLOR="echo -e \E[1;31m"
END="\E[0m"
DIR=/tmp/`date +%F_%H-%M-%S`
mkdir $DIR
mv $* $DIR
${WANGING_COLOR} MOVE $* to $DIR $END
[root@localhost ~]# chmod +x shell/move.sh
[root@localhost ~]# touch {a,b,c}
[root@localhost ~]# ls
a anaconda-ks.cfg b c shell
[root@localhost ~]# shell/move.sh a b c
MOVE a b c to /tmp/2022-08-16_10-07-55
[root@localhost ~]# tree /tmp/
/tmp/
└── 2022-08-16_10-07-55
├── a
├── b
└── c
?
1 directory, 3 files
[root@localhost ~]# 8、 退出狀態(tài)碼變量
進程執(zhí)行后,將使用變量 ? 保存狀態(tài)碼的相關數字,不同的值反應成功與失敗, ?保存狀態(tài)碼的相關數字,不同的值反應成功與失敗, ?保存狀態(tài)碼的相關數字,不同的值反應成功與失敗,的取值范圍為[0,255]
$?的值為0 代表成功 $?的值不為0 代表失敗
用戶可以在腳本中使用以下命令自定義退出狀態(tài)碼
exit [n]
實例:
[root@localhost ~]# ping -c 2 www.baidu.com > /dev/null [root@localhost ~]# echo $? 0 [root@localhost ~]# cmd -bash: cmd: 未找到命令 [root@localhost ~]# echo $? 127 [root@localhost ~]#
注意:
- 腳本中一旦遇到了exit命令,腳本會立即終止;終止退出狀態(tài)取決于exit命令后面的數字
- 如果未給腳本指定退出狀態(tài)碼,整個腳本的退出狀態(tài)碼取決于腳本中執(zhí)行的最后一條命令的狀態(tài)碼
實例1:$?獲取上一個命令的退出狀態(tài)
#!/bin/bash
if [ "$1"==100 ];then
exit 0 #參數正確,退出狀態(tài)為0
else
exit 1 #參數錯誤,退出狀態(tài)為1
fiexit表示退出當前 Shell 進程,我們必須在新進程中運行 test.sh,否則當前 Shell 會話(終端窗口)會被關閉,我們就無法取得它的退出狀態(tài)了
[root@localhost re_study]# bash test.sh 100 [root@localhost re_study]# echo $? 0 [root@localhost re_study]# bash test.sh 99 [root@localhost re_study]# echo $? 1 [root@localhost re_study]#
實例2:$?獲取函數的返回值
#!/bin/bash
#得到兩個數相加的和
function add(){
return `expr $1 + $2`
}
add 23 50 #調用函數
echo $? #獲取函數返回值# 運行結果: [root@localhost re_study]# bash test.sh 73
9、 展開命令行
9.1展開命令執(zhí)行順序
把命令行分成單個命令詞
展開別名
展開大括號的聲明{}
展開波浪符聲明(~)
命令替換$()和``
再次把命令行分成命令詞
展開文件通配(*,?,[abc]等)
準備I/O重導向(<,>)
運行命令9.2 防止擴展
反斜線(\)會使隨后的字符按原意解釋
實例:
[root@localhost ~]# echo Your cost: \$5.00 Your cost: $5.00 [root@localhost ~]#
9.3 加引號來防止擴展
單引號 ' ' 防止所有擴展;保留字符原意 雙引號 " " 可防止擴展;保留shell中字符的特俗含義
括號的作用:
():執(zhí)行內部命令時會開啟子shell
[] : 用于條件判斷或數學運算
{} : 執(zhí)行內部命令時不開啟子shell
$括號的作用:
$() : 相當于
$[] : 數學運算
${} : 區(qū)別變量名9.4 變量擴展
``:反引號,命令替換;引用引號內命令的執(zhí)行結果 \:反斜線,禁止單個字符擴展 ?。簢@號,歷史命令替換
轉義符:\ ? 轉換原意: \n : 換行 \t : 水平制表符tab鍵 ,字符間距 \v : 垂直制表符 ,行間距 \r : 回車,提交作用的 ? 轉換現有含義: \$ : 屏蔽引用變量的含義 \` \" \'
10、 腳本安全和set(暫時不用)
set命令:可以用來定制shell環(huán)境
10.1 $-變量
- h:hashell,打開選項后,Shell會將命令所在的路徑hash下來,避免每次都要查詢。通過set +h將h選項關閉.默認開啟
- i:interactive-comments,包含這個選項說明當前的shell是一個交互式的shell。所謂的交互式shell,在腳本中,i選項是關閉的
- m:monitor,打開監(jiān)控模式,就可以通過Job control來控制進程的停止,繼續(xù),后臺或者前臺執(zhí)行等
- B:braccexpand,大括號擴展
- H:history,H選項打開,可以展開歷史列表中的命令,可以通過
!來完成,例如!!返回最近的一個歷史命令,!n返回第n個歷史命令
實例:
[root@localhost ~]# echo $-
himBHs
[root@localhost ~]# hash
命中 命令
1 /usr/sbin/ping
[root@localhost ~]# set +h
[root@localhost ~]# echo $-
imBHs
[root@localhost ~]# hash
-bash: hash: 已禁用哈希
[root@localhost ~]#
?
[root@localhost ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# set +B
[root@localhost ~]# echo {1..10}
{1..10}
[root@localhost ~]#
?
[root@localhost ~]# set +H
[root@localhost ~]# history !!
-bash: history: !!: 需要數字參數
[root@localhost ~]# history !3
-bash: history: !3: 需要數字參數
[root@localhost ~]# set -H
[root@localhost ~]# history !!
history set -H
-bash: history: set: 需要數字參數
[root@localhost ~]# history !3
history ifconfg
-bash: history: ifconfg: 需要數字參數
[root@localhost ~]# 10.2 set命令實現腳本安全
- -u:在擴展一個沒有設置的變量時,顯示錯誤信息,等同于set -o nounset
- -e:如果一個命令返回一個非0退出的狀態(tài)值(失敗)就退出,等同于set -o errexit
- -o:option 顯示,打開或關閉選項
- 顯示選項:set -o
- 打開選項:set -o 選項
- 關閉選項:set +o 選項
- -x:當執(zhí)行命令時,打印命令及其參數,類似bash -x
實例:
[root@localhost ~]# set -o allexport off braceexpand off emacs on errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off [root@localhost ~]# vim shell/error.sh #!/bin/bash echo "Hello World" sssss echo "Hello Linux" [root@localhost ~]# chmod +x shell/error.sh [root@localhost ~]# shell/error.sh Hello World shell/error.sh:行3: sssss: 未找到命令 Hello Linux [root@localhost ~]# vim shell/error.sh #!/bin/bash set -e echo "Hello World" sssss echo "Hello Linux" [root@localhost ~]# shell/error.sh Hello World shell/error.sh:行4: sssss: 未找到命令 [root@localhost ~]#
到此這篇關于shell 腳本語言的變量用法示例詳解的文章就介紹到這了,更多相關shell 變量用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

