bash腳本變數
A. 如何在shell腳本中設置環境變數
如何通過shell腳本設置全局的環境變數
-bash-3.00# env
HZ=100
LC_MONETARY=en_US.ISO8859-1
SHELL=/usr/bin/bash
TERM=ansi
LC_NUMERIC=en_US.ISO8859-1
MAIL=/var/mail/pc
PATH=/usr/sbin:/usr/bin:.
LC_MESSAGES=C
LC_COLLATE=en_US.ISO8859-1
PWD=/export/home/pc
TZ=PRC
SHLVL=1
HOME=/export/home/pc
LOGNAME=pc
LC_CTYPE=en_US.ISO8859-1
LC_TIME=en_US.ISO8859-1
_=/usr/bin/env
如果只想看指定兆斗談的變數設置,如路徑PATH的銷彎設置,可族碰以用 "echo $PATH"或 「 env | grep PATH"或」 env | grep -i path"來查詢。前面的適合知道全名的,後面2種適合只知道部分欄位或者部分關鍵字母(甚至不確定字元大小寫)的。
-bash-3.00# echo $PATH
/usr/sbin:/usr/bin:.
-bash-3.00# env | grep PATH
PATH=/usr/sbin:/usr/bin:.
B. Bash編程013——環境變數
環境變數可以幫助提升你的Shell體驗。很多程序和腳本都通過環境變數來獲取系統信息,存儲臨時數據和配置信息。
bash使用環境變數( environment variables)來存儲有關shell會話和工作環境的信息。這項功能允許你在內存中存儲數據,以便程序或shell腳本能夠輕松訪問。這是存儲持久山消猛數據的一種簡便方法。bash的環境變數分為兩類:全局變數和局部變數。
補充:bash使用一致的專有環境變數,但是不同發行版的linux可能會添加自己的環境變數,本博客使用的發行版為Ubuntu 16.04.5 Gnome。
全局變數對於shell會話和所有生成的子shell都是可見的。全局環境變數有助於子shell獲取父shell信息。
在Linux中有四個命令可以幫助我們查看所有的環境變數,printenv、env、set、declare。
使用set命令時會一起顯示之前定義的函數,僅顯示變數可以使用如下命令:
局部變數只能在定義它們的進程中可見,Linux也有默認定義的標准局部環境變數。你也可以自己定義局部環境變數,稱為用戶定義局部變數。
set命令會顯示某個特定進程的所有環境變數,包括局部變數、全局變數以及用戶定義變數。
補充:set、env、printenv之間的區別很細微。set命令會顯示出所有變數,並且按照字母順序排序。env和printenv輸出相同,但是僅含有全局變數,並且未對變數排序。
設置局部用戶定義變數,就是之前002一節提到的變數。
注意:一般bash的環境變數都是使用的大寫字母,建議自己的變數名為小寫,避免產生沖突。
設置全局環境變數
先創建一個局部環境變數,然後使用export命令將其導出到全局變數。
使用unset命令,格式unset varname
注意:在子shell中刪除全局環境變數不會影響到父shell的全局環境變數。
HOME:當前用戶的主目錄
IFS:shell用來將文本字元串分割成欄位的一系列字元
PATH:shell用來查找命令的目錄列表。當你輸入一個命令時,shell會按照這個目錄遍歷尋找。
在登錄系統啟動一個bash shell時,默認情況下bash會在幾個文件中查找命令。這些文件叫做啟動文件或者環境文件。bash檢查的啟動文件取決於啟動bash的方式:
登錄Linux系統是,bash作為登錄shell啟動。登錄shell會一次從以下幾個啟動文件中讀取命令。
/etc/profile文件是系統上默認的bash shell的主啟動文件。系統上的每個用戶登錄時都是執行這個文件。
注意: 某些橋老Linux發行版使用了可拆卸式認證模塊(PAM)。這時,PAM文件會在bash啟動前處理,這些文件可能會包含環境變數。PAM文件包括/etc/environment和$HOME/.pam_environment文件。
我們這里來查看一下/etc/profile文件的內容,學了之前的內容的話,這個文件很容易理解。
$HOME目錄下的啟動文件
剩下的啟動文件都啟著同一個作用:提供一個用戶專屬的啟動文件來定義該用戶所用到的環境變數。一般Linux發行版只有到下面這四個啟動文件中的一兩個。
這里列出Ubuntu的啟動文件:
可以看到這里只有.bashrc和.profile兩個文件。
shell會按照以下順序執行啟動文件,找到第一個其他的就會被逗橋忽略。
注意:這里沒有$HOME/.bbashrc,因為該文件是通過上面三個文件中的一個運行的。
我們來查看一下.profile文件,.bashrc文件請自行查看。
注意:這里會檢查當前運行的shell是否是bash,如是的話,檢查是否存在$HOME/.bashrc,若存在則載入該文件。
互動式shell不是登錄系統時啟動的,它可能是你打開終端啟動的。互動式shell不會訪問/etc/profile文件,而是只會檢查用戶HOME目錄中的.bashrc文件。
執行shell腳本是的非互動式shell。腳本能以不同的方式執行,可以啟動子shell執行,也可以在當前shell中執行。
bash提供了一個BASH_ENV的環境變數,當shell啟動一個非互動式shell進程時,它會檢查這個環境邊浪來查看要執行的啟動文件。若有指定的文件,則shell會執行該文件。Ubuntu未設置該變數。
若BASH_ENV未設置,那麼非互動式shell如何獲得環境變數呢?對於以子shell進程執行的情況,子shell會繼承父shell導出的變數(export)。對於在當前shell中執行的情況,變數即為當前shell的變數。
C. bash shell 裡面有全局變數這個概念嗎
有。
函數內部的變數默差嘩襲認是全局的,定義時,前面加上local就是局部的。你執行下面的命令:
1)bash
2)help
3)help local
4)help declare
命令1)保證你進入bash環境;
命令2)查看bash的內置命令列表,你應蘆塌該可以看見local ;
命令3)的作用是查看local 命令的幫助,例如某函數虛兄內,local x,表明x是局部變數,它只在函數內有效,函數外如果有x變數和函數內的不是同一個x。
命令4)是查看declare 命令的幫助,你可以看見declare -g 用來定義全局變數,例如某函數內,declare -g x,表明x是全局變數。
供參考,謝謝!
D. 如何在shell腳本中使用變數
在shell腳本中變數的定義,只能以字母和下劃線開始,區分大小寫,可以包含數字、字母下劃線。
示例代碼,讀取用戶輸入到變數myvar,然後再輸入。
#!/bin/bash
echo "input myvar"
read myvar
echo "myvar is $myvar"
效果如下:
E. 查看bash變數值正確的方法是
查看猛梁弊bash變數值正確的方法如下。
1、我們先創造一個簡單的腳本。將HelloWorld。。輸出到控制台。使用vi命令創建新文件。
2、打開編輯器後,枝族按如下所示編寫。#。/usr/bin/bashecho"HelloWorld。。"exit0第一行上的#。/usr/bin/bash表示它是使用bash的shell腳本。
3、使渣纖用exit0退出bash。參數0表示正常結束。
F. Bash 腳本進階,經典用法及其案例
前言:在linux中,Bash腳本是很基礎的知識,大家可能一聽腳本感覺很高大上,像我當初剛開始學一樣,感覺會寫腳本的都是大神。雖然復雜的腳本是很燒腦,但是,當我們熟練的掌握了其中的用法與技巧,再多加練習,總有一天也會成為得心應手的腳本大神。腳本在生產中的作用,想必我我不說,大家也都知道,腳本寫的6,可以省下很多復雜的操作,減輕自己的工作壓力。好了,廢話不多說,接下來,就是Bash腳本的用法展示。
(1)用法格式
if 判斷條件 1 ; then
條件為真的分支代碼
elif 判斷條件 2 ; then
條件為真的分支代碼
elif 判斷條件 3 ; then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
逐條件進行判斷,第一次遇為「真」條件時,執行其分支,而後結束整個if。
(2)經典案例:
① 判斷年紀
分析:請輸入年紀,先判斷輸入的是否含有除數字以外的字元,有,就報錯;沒有,繼續判斷是否小於150,是否大於18。
② 判斷分數
分析:請輸入成績,先判斷輸入的是否含有除數字以外的字元,有,就報錯;沒有,繼續判斷是否大於100,是否大於85,是否大於60。
(1)用法格式
case $name in;
PART1)
cmd
;;
PART2)
cmd
;;
*)
cmd
;;
esac
注意:case 支持glob 風格的通配符:
*: 任意長度任意字元
?: 任意單個字元
[] :指定范圍內的任意單個字元
a|b: a 或b
(2)案例:
判斷yes or no
分析:請輸入yes or no,回答Y/y、yes各種大小寫組合為yes;回答N/n、No各種大小寫組合為no。
(1)用法格式
① for name in 列表 ;do
循環體
done
② for (( exp1; exp2; exp3 )) ;do
cmd
done
exp1隻執行一次,相當於在for里嵌了while
③ 執行機制:依次將列表中的元素賦值給「變數名」; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束
列表的表示方法,可以glob 通配符,如{1..10} 、*.sh ;也可以變數引用,如: `seq 1 $name`
(2)案例
① 求出(1+2+...+n)的總和
分析:sum初始值為0,請輸入一個數,先判斷輸入的是否含有除數字以外的字元,有,就報錯;沒有判斷是否為0,不為0進入for循環,i的范圍為1~輸入的數,每次的循環為sum=sum+i,循環結束,最後輸出sum的值。
② 求出(1+2+...+100)的總和
分析:i=1,num=0;當i<=100,進入循環,若i 2取余=1,則sum=sum+i,i=i+1。
(1)用法格式
while 循環控制條件 ;do
循環
done
循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為「true」 ,則執行一次循環;直到條件測試狀態為「false」 終止循環
(2)特殊用法(遍歷文件的每一行):while read line; do控制變數初始化循環體done < /PATH/FROM/SOMEFILE或 cat /PATH/FROM/SOMEFILE | while read line; do循環體done依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變數line
(3)案例:
① 100以內所有正奇數之和
分析:sum初始值為0,i的初始值為1;請輸入一個數,先判斷輸入的是否含有除數字以外的字元,有,就報錯;沒有當i<100時,進入循環,判斷 i 2取余 是否不為0,不為0時為奇數,sum=sum+i,i+1,為0,i+1;循環結束,最後輸出sum的值。
(1)用法
unitl 循環條件 ;do
循環
done
進入條件:循環條件為true ;退出條件:循環條件為false;剛好 和while相反 ,所以不常用,用while就行。
(2)案例
監控xiaoming用戶,登錄就殺死
分析:每隔0.5秒掃描,直到發現xiaoming用戶登錄,殺死這個進程,退出腳本,用於監控用戶登錄。
(1)用法
select variable in list
do
循環體命令
done
① select 循環主要用於創建菜單,按數字順序排列的示菜單項將顯示在標准錯誤上,並顯示PS3 提示符,等待用戶輸入
② 用戶輸入菜單列表中的某個數字,執行相應的命令
③ 用戶輸入被保存在內置變數 REPLY 中
④ select 是個無限循環,因此要記住用 break 命令退出循環,或用 exit 按 命令終止腳本。也可以按 ctrl+c退出循環
⑤ select 和 經常和 case 聯合使用
⑥ 與for循環類似,可以省略 in list, 此時使用位置參量
(2)案例:
生成菜單,並顯示選中的價錢
分析:PS3是select的提示符,自動生成菜單,選擇5break退出循環。
(1)語法
continue [N]:提前結束 第N層的本輪 循環,而直接進入下一輪判斷;最內層為第1層
break [N]:提前結束 第N層 循環,最內側為第1層
例:while CONDTITON1; doCMD1if CONDITION2; thencontinue / breakfiCMD2done (2)案例:
① 求(1+3+...+49+53+...+100)的和
分析:做1+2+...+100的循環,當i=51時,跳過這次循環,但是繼續整個循環,結果為:sum=2449
② 求(1+3+...+49)的和
分析:做1+2+...+100的循環,當i=51時,跳出整個循環,結果為:sum=625
(1)作用
用於將參數列表list左移指定次數,最左端的那個參數就從列表中刪除,其後邊的參數繼續進入循環
(2)案例:
① 創建指定的多個用戶
分析:如果沒有輸入參數(參數的總數為0),提示錯誤並退出;反之,進入循環;若第一個參數不為空字元,則創建以第一個參數為名的用戶,並移除第一個參數,將緊跟的參數左移作為第一個參數,直到沒有第一個參數,退出。
② 列印直角三角形的字元
true 永遠返回成功結果
: null command ,什麼也不幹,返回成功結果
false 永遠返回錯誤結果
創建無限循環
while true ;do
循環體
done
(1)用法
for name in 列表 ;do
{
循環體
}&
done
wait
(2)實例:
搜尋自己指定ip(子網掩碼為24的)的網段中,UP的ip地址
分析:請輸入一個IP地址例192.168.37.234,如果格式不是0.0.0.0 則報錯退出;正確則進入循環,IP變數的值為192.168.37. i的范圍為1-254,並行ping 192.168.37.1-154,ping通就輸出此IP為UP。直到循環結束。
trap ' 觸發指令' 信號,自定義進程收到系統發出的指定信號後,將執行觸發指令,而不會執行原操作
trap '' 信號,忽略信號的操作
trap '-' 信號,恢復原信號的操作
trap -p ,列出自定義信號操作
信號可以3種表達方法:信號的數字2、全名SIGINT、縮寫INT
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當於Ctrl+c
3) SIGQUIT: 相當於ctrl+
9) SIGKILL: 強制殺死正在運行的進程
15) SIGTERM :終止正在運行的進程(默認為15)
18) SIGCONT :繼續運行
19) SIGSTOP :後台休眠
9 信號,強制殺死,捕獲不住
① 列印0-9,ctrl+c不能終止
分析:i=0,當i<10,每休眠1秒,i+1,捕獲2信號,並執行echo press ctrl+c
② 列印0-3,ctrl+c不能終止,3之後恢復,能終止
分析:i=0,當i3時,解除捕獲2信號。
1、生成隨機字元 cat /dev/urandom
生成8個隨機大小寫字母或數字 cat /dev/urandom |tr -dc [:alnum:] |head -c 8
2、生成隨機數 echo $RANDOM
確定范圍 echo $[RANDOM%7] 隨機7個數(0-6)
echo $[$[RANDOM%7]+31] 隨機7個數(31-37)
3、echo列印顏色字
echo -e "33[31malong33[0m" 顯示紅色along
echo -e "33[1;31malong33[0m" 高亮顯示紅色along
echo -e "33[41malong33[0m" 顯示背景色為紅色的along
echo -e "33[31;5malong33[0m" 顯示閃爍的紅色along
color=$[$[RANDOM%7]+31]
echo -ne "33[1;${color};5m*33[0m" 顯示閃爍的隨機色along
G. 如何在shell腳本中使用變數
1、linux shell中的變數一般定義格式為:var=value。其中var是變數名稱,=是賦值,value是給變數賦的值。比如下面的變數定義。
a=12;
b="helloworld"
2、注意變數名稱的第一個字元不可以是數字,但是可以是下劃線。如下示例則為非法的變數名。
3、要使用變數的值,在變數前面加上$符號即可。比如下面的示例:
123=123//這是錯誤的變數名稱
_123=123//這是合法的。
H. 如何在shell腳本中使用變數
在網路中 搜索 linux 系統中使用變數 關鍵詞 ,有問題網路。 下面是我查的示例。
顯示環境變數HOME
$ echo $HOME
/home/redbooks
2. 設置一個新的環境變數hello
$ export HELLO="Hello!"
$ echo $HELLO
Hello!
3. 使用env命令顯示所有的環境變數
$ env
HOSTNAME=redbooks.safe.org
PVM_RSH=/usr/bin/rsh
Shell=/bin/bash
TERM=xterm
HISTSIZE=1000
...
4. 使用set命令顯示所有本地定義的Shell變數
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION='2.05b.0(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
5. 使用unset命令來清除環境變數
set可以設置某個環境變數的值。清除環境變數的值用unset命令。如果未指定值,則該變數值將被設為NULL。示例如下:
$ export TEST="Test..." #增加一個環境變數TEST
$ env|grep TEST #此命令有輸入,證明環境變數TEST已經存在了
TEST=Test...
$ unset $TEST #刪除環境變數TEST
$ env|grep TEST #此命令沒有輸出,證明環境變數TEST已經存在了
6. 使用readonly命令設置只讀變數
如果使用了readonly命令的話,變數就不可以被修改或清除了。示例如下:
$ export TEST="Test..." #增加一個環境變數TEST
$ readonly TEST #將環境變數TEST設為只讀
$ unset TEST #會發現此變數不能被刪除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #會發現此也變數不能被修改
-bash: TEST: readonly variable
環境變數的設置位於/etc/profile文件
如果需要增加新的環境變數可以添加下屬行
export path=$path:/path1:/path2:/pahtN
-----------------------------------------------------------------------------------------------------------------------
1.Linux的變數種類
按變數的生存周期來劃分,Linux變數可分為兩類:
1.1 永久的:需要修改配置文件,變數永久生效。
1.2 臨時的:使用export命令聲明即可,變數在關閉shell時失效。
2.設置變數的三種方法
2.1 在/etc/profile文件中添加變數【對所有用戶生效(永久的)】
用VI在文件/etc/profile文件中增加變數,該變數將會對Linux下所有用戶有效,並且是「永久的」。
例如:編輯/etc/profile文件,添加CLASSPATH變數
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
註:修改文件後要想馬上生效還要運行# source /etc/profile不然只能在下次重進此用戶時生效。
2.2 在用戶目錄下的.bash_profile文件中增加變數【對單一用戶生效(永久的)】
用VI在用戶目錄下的.bash_profile文件中增加變數,改變數僅會對當前用戶有效,並且是「永久的」。
例如:編輯guok用戶目錄(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下內容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
註:修改文件後要想馬上生效還要運行$ source /home/guok/.bash_profile不然只能在下次重進此用戶時生效。
2.3 直接運行export命令定義變數【只對當前shell(BASH)有效(臨時的)】
在shell的命令行下直接使用[export 變數名=變數值] 定義變數,該變數只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變數也就失效了,再打開新shell時就沒有這個變數,需要使用的話還需要重新定義。
3.環境變數的查看
3.1 使用echo命令查看單個環境變數。例如:
echo $PATH
3.2 使用env查看所有環境變數。例如:
env
3.3 使用set查看所有本地定義的環境變數。
unset可以刪除指定的環境變數。
4.常用的環境變數
PATH 決定了shell將到哪些目錄中尋找命令或程序
HOME 當前用戶主目錄
HISTSIZE歷史記錄數
LOGNAME 當前用戶的登錄名
HOSTNAME指主機的名稱
SHELL 當前用戶Shell類型
LANGUGE 語言相關的環境變數,多語言可以修改此環境變數
MAIL當前用戶的郵件存放目錄
PS1基本提示符,對於root用戶是#,對於普通用戶是$
I. shell 腳本里的變數怎麼加1
shell 腳本里變數加一方式如下六種:
1、第一種整型變數自增方式
a=$(($a+1))
echo$a
2、第二種整型變數自增方式a=$[$a+1]
echo$a
a=`expr$a+1`
echo$a
leta++
echo$a
5、第五種整型變數自增方式leta+=1
echo$a
6、第六種整型變數自增方式((a++))
echo$a
(9)bash腳本變數擴展閱讀:
基本上shell分兩大類:
1、圖形界面shell(Graphical User Interface shell 即 GUI shell)
應用最為廣泛的 Windows Explorer (微軟的windows系列操作系統),還有也包括廣為人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更強大的CDE、GNOME、KDE、 XFCE。
2、命令行式shell(Command Line Interface shell ,即CLI shell)
bash / sh / ksh / csh / zsh(Unix/linux 系統),cmd.exe/ 命令提示字元(Windows NT 系統),Windows PowerShell(支持 .NET Framework 技術的 Windows NT 系統),傳統意義上的shell指的是命令行式的shell,以後如果不特別註明,shell是指命令行式的shell。
J. bash的環境變數的可在什麼和什麼這兩個配置文件中修改,也可用什麼命令進行臨
在Linux操作系統中,有時候跟著教程安裝了一些軟體,安裝成功後,很高興的准備運行該軟體相應命令,但是偶爾會遇到」Command not found…「的提示。原因是因為你安裝的軟體需要設置環境變數才能運行。接下來跟著小編一起學習在Linux操作系統中修改環境變數的方法。
方法一:在/etc/profile文件中添加變數【對所有用戶生效(永久的)】
用VI在文件/etc/profile文件中增加變數,該變數將會對Linux下所有用戶有效,並且是「永久的」。
要讓剛才的修改馬上生效,需要執行以下代碼
復制代碼代碼如下:
# source /etc/profile
方法二:在用戶目錄下的.bash_profile文件中增加變數【對單一用戶生效(永久的)】
用VI在用戶目錄下的.bash_profile文件中增加變數,改變數僅會對當前用戶有效,並且是「永久的」。
要讓剛才的修改馬上生效,需要在用戶目錄下執行以下代碼
復制代碼代碼如下:
# source .bash_profile
方法三:直接運行export命令定義變數【只對當前shell(BASH)有效(臨時的)】
在shell的命令行下直接使用[export變數名=變數值]定義變數,該變數只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變數也就失效了,再打開新shell時就沒有這個變數,需要使用的話還需要重新定義。
方法四:直接賦值
在命令行中輸入
復制代碼代碼如下:
PATH=$PATH:/usr/lib64/ruby/gems/2.1.0/gems/jekyll-2.5.3/bin
使用這種方法,只對當前會話有效,也就是說每當登出或注銷系統後,PATH設置就會失效。
方法彎搭五:修改拍鬧培/ect/profile文件
在文件末尾添加
復制代碼代碼如下:
export PATH=$PATH:/usr/lib64/ruby/gems/2.1.0/gems/jekyll-2.5.3/bin
//注意:"="號的兩邊不能有任何空格 這種方法最好,除
非你手動強制修改PATH的值,否則將不會被改變。
方法六:修改.bachrc/.bash_profile文件
在文件末尾添加
復制代碼代碼如下:
export PATH=$PATH:/usr/lib64/ruby/gems/2.1.0/gems/jekyll-2.5.3/bin
這種方法是針對當前用戶起襲唯作用的,當你注銷系統後也會失效
註:對於2和3方法,想讓PATH生效,必須重新登陸才能實現,以下方法可以簡化工作: 如果修改了/etc/profile,那麼編輯結束後執行 source profile 或執行點命令./profile PATH的值就會立即生效了。 這個方法的原理就是再執行一次/etc/profile shell腳本,注意如果用sh /etc/profile是不行 的,因為sh是在子shell進程中執行的,即使PATH改變了也不會反應到當前環境中,但是source是 在當前 shell進程中執行的,所以我們能看到PATH的改變。