linux--shell--變數
1. 變數
bash中變數的值都是字串
分類:
本地變數:當前shell有效
環境變數:在所有由登入程序產生的子程序有效
位置引數:只讀,用於向shell指令碼傳遞引數
2.變數使用
2.1變數替換、賦值
變數替換即引用變數的值
va1=123 va2=${va1}
值有空格則需要用雙引號括起來。變數名和等號直接不能有空格、引用變數時大括號裡不能有空格
變數賦值模式:
variable=value value賦值給變數variable
variable+value 對已賦值的變數,重設其值
variable?value、variable:?value 對未賦值的變數顯示系統錯誤資訊
variable:=value 對未賦值的變數,將value賦值給它
variable:-value 對未賦值的變數,將value賦值給它,但value不儲存到變數對應的地址空間
#!/bin/bash a="123" unset a echo ${a:-"456"} #輸出 456 echo ${a} #輸出空行 unset a echo ${a:="789"} #輸出 789 echo ${a} #輸出 789
2.2 清除變數
unset 變數名
2.3只讀變數
設定為只讀後,不能再更改其值
va1="3.14" readonly va1
3.環境變數
3.1檢視程序環境變數
cat /proc/pid/environ | tr '\0' '\n'
env #檢視當前程序環境變數
3.2定義一個環境變數
MYPATH=XXX #先賦值
export MYPATH #宣告為環境變數
3.3重要環境變數
相關檔案: .bash_profile 、.bashrc、.bash_logout
(1)PWD、OLDPWD
(2)PATH
增加新路徑:/home/usr/bin
export PATH="${PATH}:/home/usr/bin"
或
PATH="${PATH}:/home/usr/bin" export PATH
(3)HOME
(4)SHELL、BASH
預設shell
(5)USER、UID
使用者名稱、UID
(6)PPID
當前程序的父程序程序號
(7)PS1、PS2
提示符變數,用於設定提示符格式
(8)IFS
shell域分隔符,預設空格
(9)BASH_SUBSHELL
(10)BASH_VERSINFO
含6個元素,儲存了bash的版本資訊
#!/bin/bash for i in {0..5} do echo "BASH_VERSINFO[${i}]=${BASH_VERSINFO[${i}]}" done
BASH_VERSION :儲存了BASH_VERSINFO的0到4的值
(11)DIRSTACK
目錄棧棧頂
(12)GROUPS
當前使用者所屬群組
(13)
HOSTNAME:主機名
HOSTTYPE、MACHTYPE:硬體架構,同BASH_VERSINFO[5]
(14)REPLY
read讀取的標準輸入儲存到表裡時,若沒有帶變數名,則讀到的標準輸入儲存到REPLY變數
對select命令(select迴圈),序號儲存到REPLY變數
(15 )SECONDS
記錄指令碼從開始執行到結束消耗的時間,單位秒
(16) SHELLOPTS
(17)SHLVL
shell巢狀的層次
(18)TMOUT
設定shell的過期時間
4.位置引數
表示命令列向shell指令碼傳遞的引數
$*、$@ 表示全部引數
$0 指令碼名字
${10} 第10個引數
$# 傳遞到指令碼的引數數量
$$ 指令碼執行的程序號
$? 命令的退出狀態。0,沒有錯誤 非0,有錯誤
5. 引用
(1)
將字串用引用符號引起來,防止特殊字元被shell指令碼解釋為特殊意義。如$、*等有多個意義的字元。引用後特殊字元表現為字面意義
雙引號"" 引用除 美元符$ 反引號` 反斜線\ 之外的所有字元
單引號'' 引用所有的字元
反引號`` shell將反引號中內容解釋為系統命令
反斜線\ 轉義符
雙引號引用變數防止字串分割,保留變數中的空格:
a="A B C" echo ${a} #輸出A B C 丟失了空格 echo "${a}" #輸出A B C 防止了字串分割 echo '${a}' #單引號全引用,輸出 ${a} 這樣的字面字串
(2)命令替換
將命令的標準輸出作為值賦給變數
a=`pwd` b=$(pwd) #$() 的方式可以巢狀使用
命令替換返回有多行時,要若不引用命令替換結果,則換行符會被刪除
a=`ls -l .` echo ${a} #輸出無換行符,很雜亂 echo "${a}" #一個檔案/目錄一行顯示