2.shell腳本之變量

1.變量命名法則


1、不能使程序中的保留字:例如if, for
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義
4、統一命名規則:駝峯命名法
5、=前後不要帶空格
6、字符串建議加" " :如name=“chenjuxni”

變量引用:
語法:$變量名 或者 ${變量名},引用字符串變量建議加"$name"
unset 變量名:刪除變量,釋放內存空間,腳本執行完之後寫上刪除變量的命令,避免變量佔用內存。

命令引用:
方法一:`hostname`
方法二:$(hostname)

例子:
1.#title=“ceo” 定義變量title,在內存中有對應空間,空間包含着ceo字符串
2.#name=$title 把title變量賦值給name變量,意味着name變量也指向ceo字符串
3.#echo $name 所以name變量輸出的是ceo
ceo
在這裏插入圖片描述
4.title=“boss” 給title變量重新賦值,在內存中開闢新空間,指向boss字符串,因爲ceo字符串仍然有name變量指向,所以ceo字符串是不會被執行內存回收。
5.echo $name
eco

在這裏插入圖片描述

2.變量分類


根據變量的生效範圍等標準劃分下面變量類型:
局部變量:生效範圍爲當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效

例子:
[root@Centos7 bin]#echo KaTeX parse error: Can't use function '$' in math mode at position 36: …想查看父進程PID,echo $̲PPID 4297 [root… 查看當前進程,PID=7738
7738
[root@Centos7 bin]#pstree -p | grep sshd pstree -p可以查看進程關係,管道和grep篩選bash進程
|-sshd(1010)-±sshd(4291)—bash(4297)—bash(7738)-±grep(7772)
| |-sshd(4964)—bash(4972)
| `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo $name 在子進程使用name變量,顯示是空。

以上例子說明了局部變量生效範圍僅限當前進程,子進程無效,同理父進程也是無效。

環境(全局)變量:生效範圍爲當前shell進程及其子進程 ,父進程無效。
應用:當A腳本定義一個全局變量的話,B腳本就可以使用A腳本定義的全局變量
定義全局變量格式:#export 變量名=""
查看系統的環境變量:#declare -x ,#env

常見的系統變量:
HOME 用戶的主目錄(即家目錄)
SHELL 用戶在使用的Shell解釋器名稱
HISTSIZE 輸出的歷史命令記錄條數
HISTFILESIZE 保存的歷史命令記錄條數
MAIL 郵件保存路徑
LANG 系統語言、語系名稱
RANDOM 生成一個隨機數字
生成31-37的隨機數,思路:最大最小同時減去最小值。31-31~37-31=0~6,6+1=7,所以RANDOM%7
#echo $[RANDOM%7+31]
PS1 Bash解釋器的提示符
PATH 定義解釋器搜索用戶執行命令的路徑
EDITOR 用戶默認的文本編輯器

例子:
[root@Centos7 bin]#pstree -p | grep sshd
|-sshd(1010)-±sshd(4291)—bash(4297)-±grep(8003)
| |-sshd(4964)—bash(4972)
| `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo KaTeX parse error: Expected 'EOF', got '#' at position 44: …ot@Centos7 bin]#̲export username… 查看子進程
8014
[root@Centos7 bin]#pstree -p | grep sshd 查看進程關係,和PID=4297是父子關係進程
|-sshd(1010)-±sshd(4291)—bash(4297)—bash(8014)-±grep(8043)
| |-sshd(4964)—bash(4972)
| \ `-sshd(7616)—bash(7623)
[root@Centos7 bin]#echo $username 在子進程可以使用全局變量username
father

腳本執行方式
之前有說過執行一個腳本幾種方法:
1.bash demo.sh
2.source demo.sh == .demo.sh
3./data/demo.sh 全路徑執行,也可以當前路徑執行./demo.sh
但是這幾種方式,有什麼區別呢?

編寫一個腳本:
#!/bin/bash
name=chen
echo “當前進程是:$$”
echo “父進程是:$PPID”

1.bash 方式執行
[root@Centos7 bin]#echo $$ 查看當前進程
8014
[root@Centos7 bin]#bash demo.sh
當前進程是:8420
父進程是:8014
#說明bash執行,是開啓子進程執行腳本的。

2.全路徑或者當前路徑執行
[root@Centos7 bin]#./demo.sh
當前進程是:8443
父進程是:8014
由上2個例子得出,bash和全路徑執行腳本,都是開闢子進程運行腳本的。

3.source 方式,也等價於.demo.sh
[root@Centos7 bin]#source demo.sh
當前進程是:8014
父進程是:4297
[root@Centos7 bin]#echo $name
chen
source方式執行,不開闢子進程運行腳本,而是在當前進程執行,即使腳本運行完,我們也可以調用腳本中的變量name。但是這種方式運行腳本,導致腳本中的變量沒有釋放內存,造成內存佔用,僅適用設置配置文件的時候。

所以我們平時執行腳本,推薦使用bash和路徑方式執行腳本,配置環境文件的時候使用source方式。

面試題:
():相當與開啓子進程執行,變量賦值受影響,子進程結束就沒有了。
[root@Centos7 bin]#name=parent;(echo “1:$name”;name=son;echo “2:$name”);echo “3:$name”
1:parent
2:son
3:parent

{}:不開啓子進程,在當前進程執行,注意:{ 要帶空格 }
[root@Centos7 bin]#name=parent;{ echo “1:$name”;name=son;echo “2:$name”; };echo “3:$name”
1:parent
2:son
3:son

3.特殊變量


位置變量:$1, $2, …來表示,用於讓腳本在腳本代碼中調用通過命令行傳遞給它 的參數
在這裏插入圖片描述
$1, $2, …${11},${12}:對應第1、第2等參數
$0: 腳本名稱
$#:參數數量
$*: 傳遞給腳本的所有參數,全部參數合爲一個字符串
$@: 傳遞給腳本的所有參數,每個參數爲獨立字符串

例子:
[root@Centos7 bin]#cat demo.sh
#!/bin/bash
echo “當前腳本名稱是:`basename 0""echo"0`"" echo "總共有#個參數,分別是:$*”
echo “第1個參數爲$1,第5個爲$5。”

[root@Centos7 bin]#bash demo.sh
當前腳本名稱是:demo.sh
總共有0個參數,分別是:
第1個參數爲,第5個爲。

例子2:文件作爲參數
1.腳本內容
[root@Centos7 bin]#cat demo.sh
#!/bin/bash
scp $* [email protected]:/data/

2.執行腳本,apache34.sh createfile34.sh作爲參數
[root@Centos7 bin]#bash demo.sh apache34.sh createfile34.sh
[email protected]’s password: 輸入密碼:IP172.16.34.103root的密碼
apache34.sh 100% 265 289.9KB/s 00:00
createfile34.sh 100% 143 146.5KB/s 00:00

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章