shell中變量定義及應用
1. 自定義環境變量
1.1 設置環境變量
如果想要設置環境變量,就要在給變量賦值之后或在設置變量時使用export命令,具體設置見下文的示例。其實,除了export命令,帶-x選項的declare內置命令也可以完成同樣的功能(注意:此處不要在變量名前面加$)。
export命令和declare命令的格式如下:
1.export 變量名=value
2.變量名=value;export 變量名
3.declare -x 變量名=value
- 范例:定義環境變量並賦值
export NAME=oldboy
declare -x NAME=oldboy
NAME=oldboy;export
------------------------------------
[root@zabbix ~]# tail -1 /etc/profile
export OLDBOY='oldboy'
[root@zabbix ~]# source /etc/profile
[root@zabbix ~]# echo $OLDBOY
oldboy
[root@zabbix ~]# env|grep OLDBOY
OLDBOY=oldboy
1.2 讓環境變量永久生效的常用設置文件
- (1)用戶的環境變量配置
對於用戶的環境變量設置,比較常見的是用戶家目錄下的.bashrc和.bash_profile。
[root@zabbix ~]# ll /root/.bashrc -- 推薦使用
-rw-r--r--. 1 root root 176 Dec 29 2013 /root/.bashrc
[root@zabbix ~]# ll /root/.bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 /root/.bash_profile
- (2)全局環境變量的配置
/etc/profile
/etc/bashrc -- 推薦使用
/etc/profile.d/
## 若要在登錄后初始化或顯示加載內容,則把腳本文件放在/etc/profile.d/下即可(無須加執行權限)。
-
(3)設置登錄提示的兩種方式
- 在/etc/motd中增加提示內容
[root@zabbix ~]# cat /etc/motd welcome to moox linux shell training.
- 在/etc/profile.d/目錄下增加腳本文件
[root@zabbix ~]# cat /etc/profile.d/moox.sh echo "Here is moox shell training."
1.3 顯示與取消環境變量
- 1.通過echo或printf命令打印環境變量
[root@zabbix ~]# echo $SHELL
/bin/bash
[root@zabbix ~]# printf "$SHELL"
/bin/bash[root@zabbix ~]#
[root@zabbix ~]#printf "$SHELL\n"
/bin/bash
- 2.用env或set顯示默認的環境變量
- 3.用unset消除本地變量和環境變量
[root@zabbix ~]# echo $OLDBOY
oldboy
[root@zabbix ~]# unset OLDBOY
[root@zabbix ~]# echo $OLDBOY
[root@zabbix ~]#
-
- 環境變量初始化與對應文件的生效順序
1.用戶登錄系統后首先會加載`/etc/profile`全局環境變量文件
2.當加載完/etc/profile文件后,才會執行`/etc/profile.d`目錄下的腳本文件
3.之后開始運行`$HOME/.bash_profile`
4.在$HOME/.bash_profile這個文件中,又會去找`$HOME/.bashrc`
5.在$HOME/.bashrc文件中又會去找`/etc/bashrc`
2.普通變量
2.1 定義本地變量
- 1.普通變量定義
變量名=value
變量名='value'
變量名="value"
- 2.在Shell中定義變量名
變量名一般是由字母、數字、下划線組成的,可以以字母或下划線開頭.如:moox、moox123、moox_shell
- 3.連續的普通變量的定義及輸出
a=192.168.1.1
b='192.168.1.1'
c="192.168.1.1"
echo "a=$a"
echo "b=$b"
echo "c1=${c},c2=$c"
# $變量名表示輸出變量,可以用$c和${c}兩種用法
- 4.非連續普通變量定義及輸出
a=192.168.1.1-$a
b='192.168.1.1-$a'
c="192.168.1.1-$a"
echo "a=$a"
echo "b=$b"
echo "c1=${c}"
總結:>
數字內容的變量定義可以不加引號,
其他沒有特別要求的字符串等定義最好都加上雙引號,
如果真的需要原樣輸出就加單引號,
定義變量加雙引號是最常見的使用場景.
- 5.把一個命令的結果作為變量的內容賦值
反引號``和$()方法
[root@zabbix ~]# moox=`pwd`
[root@zabbix ~]# echo $moox
/root
[root@zabbix ~]# moox1=$(pwd)
[root@zabbix ~]# echo $moox1
/root
3. 范例
3.1 按天打包網站站點目錄
要求: 按天打包網站的站點目錄程序,生成不同的文件名(此為企業實戰案例)。
tar zcvf scripts_$(date +%F).tar.gz /server/scripts/
4.經驗小結
4.1常規普通變量定義
- 若變量內容為連續的數字或字符串,賦值時,變量內容兩邊可以不加引號,例如a=123。
- 變量的內容很多時,如果有空格且希望解析內容中的變量,就加雙引號,例如a="/etc/rc.local \(USER" ,此時輸出變量會對內容中的\)USER進行解析然后再輸出。
- 希望原樣輸出變量中的內容時就用單引號引起內容進行賦值,例如:a='$USER'。希望變量的內容是命令的解析結果的定義及賦值如下:
- 要使用反引號將賦值的命令括起來,例如:a=
ls
;或者用\(()括起來,例如:a=\)(ls)。變量的輸出方法如下: - 使用“$變量名”即可輸出變量的內容,常用“echo $變量名”的方式,也可用printf代替echo輸出更復雜的格式內容。
4.2變量定義的技巧及注意事項
- 注意命令變量內容前后的反引號字符(此字符為鍵盤Tab鍵上面的那個反引號,不是單引號),例如:“CMD=
ls
”。 - 在變量名前加\(可以取得該變量的值,使用echo或printf命令可以顯示變量的值,\)A和${A}的寫法不同,但效果是一樣的。
- 用echo等命令輸出變量的時候,也可用單引號、雙引號、反引號,例如:echo\(A、echo "\)A"、echo '$A',它們的用法和前面變量內容定義的總結是一致的。
- \(dbname_tname,當變量后面連接有其他字符的時候,必須給變量加上大括號{},例如:\)dbname_tname就要改成${dbname}_tname。
5.變量在awk中的特殊使用方式
5.1 使用awk調用Shell中不帶引用命令的變量
[root@zabbix ~]# ETT=123
[root@zabbix ~]# awk 'BEGIN {print $ETT}' -- 無輸出結果
[root@zabbix ~]# awk 'BEGIN {print "$ETT"}' -- 輸出原變量
$ETT
[root@zabbix ~]# awk 'BEGIN {print '$ETT'}' -- 輸出正確值
123
[root@zabbix ~]# awk 'BEGIN {print "'$ETT'"}' -- 輸出正確值
123
[root@zabbix ~]#
5.2 使用awk調用Shell中帶引用命令的變量
[root@zabbix ~]# ETT=`pwd`
[root@zabbix ~]# awk 'BEGIN {print $ETT}'
[root@zabbix ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@zabbix ~]# awk 'BEGIN {print '$ETT'}' --- 報錯
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unexpected newline or end of string
[root@zabbix ~]# awk 'BEGIN {print "'$ETT'"}' --- 正常輸出
/root
5.3 awk調用shell變量測試結果
awk \ ETT | ETT=123 | ETT='oldgirl' | ETT="tingting" | ETT=pwd反引號 |
---|---|---|---|---|
awk 'BEGIN {print "$ETT"}' -- 加雙引號 | 輸出本身 | 輸出本身 | 輸出本身 | 輸出本身 |
awk 'BEGIN {print $ETT}' -- 不加引號 | 空 | 空 | 空 | 空 |
awk 'BEGIN {print '$ETT'}' -- 加單引號 | 正確輸出 | 空 | 空 | 語法錯 |
awk 'BEGIN {print " '$ETT' "}' -- 加雙引號 | 正確輸出 | 正確輸出 | 正確輸出 | 正確輸出 |
-
結論:
awk 與一般情況恰好相反,不管變量如何定義、賦值,除了加單引號以外,利用awk直接獲取變量的輸出,結果都是一樣的,因此,在awk取用Shell變量時,我們更多地還是喜歡先用echo加符號輸出變量,然后通過管道給awk,進而控制變量的輸出結果。這就符合前面給出的普通情況的結論了
ETT="oldgirl"或ETT='oldgirl' 或 ETT=oldgirl 或 ETT=`pwd`
echo $ETT|awk '{print $0}'
6.總結
關於自定義普通字符串變量的建議
- 1)內容是純數字、簡單的連續字符(內容中不帶任何空格)時,定義時可以不加任何引號,例如:
OldboyAge=33
NETWORKING=yes
- 沒有特殊情況時,字符串一律用雙引號定義賦值,特別是多個字符串中間有空格時,例如:
NFSD_MODULE="no load"
MyName="Oldboy is a handsome boy."
- 當變量里的內容需要原樣輸出時,要用單引號(' '),這樣的需求極少,例如:
OLABOY_NAME='OLDBOY'