shell中變量定義及應用-- (環境變量及普通變量)


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. 環境變量初始化與對應文件的生效順序
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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM