變量在寫shell腳本時會經常用到,有時要引用系統變量,有時又要自定義變量,是以把變量搞清楚是後續進行shell腳本學習的基礎;變量分為本地變量(作用範圍小,在目前系統的某個環境下才能生效),全局變量(作用範圍大),内置變量(指令解釋器内部已經定義好的變量);
1、本地變量(使用者變量):
:變量名=變量值,變量名='變量值',變量名="變量值";單引号不解析變量值中所包含的變量,即元字元輸出;雙引号會解析變量值中所包含的變量;
:變量名=`指令`,變量名=$(指令);先執行指令,把其結果指派給變量;Vwho=`whoami`,echo $Vwho;Vdir=$(pwd),echo $Vdir;
2、全局變量(系統變量):在目前系統下所有環境都能生效的變量;
顯示系統所有環境變量(或export -p);
顯示Shell預先定義好的變量(全局變量)以及使用者變量(本地變量)。
通過export将使用者變量導入到系統變量;;或;
export a;export b;export c
export -p
一些寫Shell腳本時常用的系統變量:
$SHELL 預設Shell
$HOME 目前使用者家目錄
$IFS 内部字段分隔符
$LANG 預設語言
$PATH 預設可執行程式路徑
$PWD 目前目錄
$UID 目前使用者ID
$USER 目前使用者
$HISTSIZE 曆史指令大小,可通過HISTTIMEFORMAT變量設定指令執行時間;
$RANDOM 随機生成一個0至32767的整數
$HOSTNAME 主機名
下面看下他們之間差別:
Shell程序的環境變量作用域是Shell程序,當export導入到系統變量時,則作用域是Shell程序及其Shell子程序。
檢視&删除變量:
:echo $變量名;echo "$變量名";echo ${變量名};echo "${變量名}";
:unset 變量名;
3、内置變量,shell内置變量,無需定義直接使用;man bash;
:
$0 擷取目前執行的shell腳本檔案名(自身名字);
$n 擷取目前執行shell腳本(或函數)時的指定位置參數的内容,即第n個參數值,$1-$n需要注意的是從第10個開始要用花括号調用,例如${10};
$# 擷取目前shell腳本執行時的參數總個數;
$? 擷取上一條指令執行後的狀态傳回值,0為執行成功,非0則為執行失敗;
例:位置變量$n,shift可對位置變量控制;
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
# bash test.sh a b c
1: a
2: c
3:
每執行一次shift指令,位置變量個數就會減一,而變量值則提前一位。shift n,可設定向前移動n位。
:
$* 所有的位置參數被看做一個字元串;
$@ 每個位置參數被看做獨立的字元串;
$ 目前程序PID;
$! 上一條運作背景程序的PID;
《例 》:
#!/bin/bash
echo 1:$1
echo 2:$2
echo 3:$3
echo a1:$*
echo a2:$@
echo p1:$
# bash test.sh hello world i love you
1:hello
2:world
3:i
a1:hello world i love you
a2:hello world i love you
p1:12185