一、什么是shell
shell是為了使用戶能夠操作應用程序的接口程序。如經常使用的圖形界面及命令行界面都是shell。下面來介紹一下bash這個shell的功能。
二、變量的概念
被命名的內存空間即為變量,Linux中內置了許多變量,我們可以通過修改這些變量的值還制定用戶自己的bash環境。
1、顯示變量
使用echo命令來讀出變量的內容,PATH是變量的名稱,在前面加上$表示讀取變量的內容,否則只會顯示字串本身,如下所示;
也可以使用下面的方式來讀取變量的內容;
2、設置自定義變量
我們也可以自己來設置自定義變量,通過“=”號即可實現;
3、取消變量
三.變量的類型
Linux存在多種不同類型的變量,下面逐一介紹。
1、本地變量
只對當前shell進程有效,對其它shell進程和當前shell進程的子進程無效的變量;
變量的設置規則:
變量的命名應遵循以下原則:
1、只能包含字母語、數字和下劃線,并且不能以數字開頭;
2、不應該跟系統中已有的環境變量重名;
3、最好做到見名知義;
變量中的引用:
"":弱引用,里面的變量會被替換;
'':強引用,里面的所有字符都是字面量,直接輸出;
2、環境變量
環境變量是Linux系統中內置的變量,用于幫助用戶設置提示符、文件查找的路徑、語系等功能;環境變量作用于當前shell進程及其子進程,對其它的shell無效。
1)查看當前系統上的環境變量
(1)用evn查看環境變量
上面的結果中有些常用的環境變量說明如下:
HOSTNAME:主機名;
SHELL:當前環境中使用的shell程序;
HISTSIZE:記錄歷史命令的條數,默認為1000;
USER:當前用戶名;
MAIL:當前用戶的郵箱路徑;
PATH:命令查找路徑;
LANG:當前語系設置;
HOME:當前用戶的家目錄。
(2)使用export命令查看環境變量
(3)使用printenv命令查看環境變量
(4)使用set命令查看所有變量
(5)將自定義變量轉換成環境變量
腳本在執行時會啟動一個子shell進程,而父進程就會處于睡眠狀態,等子進程執行完成后再回到父進程繼續執行;父進程處于睡眠狀態時,子進程不會繼承父進程的本地變量,只會繼承環境變量,所以必須將腳本中涉及到的本地變量轉換成環境變量才能順利執行。
使用export命令來導出自定義變量為環境變量;
也可直接使用export命令來直接定義環境變量;
(6)修改環境變量
在命令行修改環境變量并不能永久生效,一旦退出shell修改就會失效。
與自定義變量的定義方式相同,可以直接為環境變量賦值;
也可以在環境變量后面追加內容;
自定義提示符
PS1定義了當前shell中的提示符信息,參數含義如下:
\u:當前用戶名
\h:主機名
\H:FQDN,完整格式主機名
\w:當前工作目錄的基名
\W:當前工作目錄的絕對路徑
\$:提示符
\t:顯示時間
3、局部變量
對shell腳本中某代碼片斷有效:通常用于函數本地;
定義方法:local VARNAME=VALUE
4、位置變量
$1,$2,…,${10}
5、特殊變量
$?:上一個命令的執行狀態返回值
$#:參數個數
$*:參數列表
$@:參數列表
6、只讀變量:
readonly VARNAME
四、變量的刪除與替換
將路徑賦值到變量p中;
${variable#word}:在variable中存儲字串上,自左而右,查找第一次出現的word,刪除字符開始至此word處的所有內容;
上面的結果表示從左向右查找第一次出現的/,并將其刪除;
${variable##word}:在variable中存儲字串上,自左而右,查找最后一次出現的word,刪除字符開始至此word處的所有內容;
上面的結果表示從左向右查找最后一次出現的/,前面的*代表任何字符;
${variable%word}:在variable中存儲字串上,自右而左,查找第一次出現的word,刪除word開始到尾部的所有內容;
上面的結果表示從右向左查找第一個/,并將其后面的內容刪除;
${variable%%word}:在variable中存儲字串上,自右而左,查找最后一次出現的word,刪除word開始到尾部的所有內容;
上面的結果表示從右向左查找最后一個/s,并將其后面的內容刪除。
變量的查找替換:
${variable/pattern/substi}:將變量中第一次出現的pattern替換為substi;
將第一次出現的123替換為321;
${variable//pattern/substi}:將變量中出現的所有的pattern替換為substi;
${variable/#pattern/substi}:將變量中位于行首的pattern替換為substi;
上面的變量并沒有被替換,因為23并是位于行首的字符;
從上面的結果看出只替換了行首的字符;
${variable/%pattern/substi}:將變量中位于行尾的pattern替換為substi;
pattern可以使用globbing中的元字符:*,?
變量的查找刪除:
${variable/pattern}:刪除pattern第一次匹配到的字符串;
${variable//pattern}:刪除pattern所有匹配到的字符串;
${variable/#pattern}:刪除pattern匹配到的行首的字符串;
${variable/%pattern}:刪除pattern匹配到的行尾字符串;
大小寫轉換:
小寫轉大寫:${variable^^}
大寫轉小寫:${variable,,}
變量賦值操作:
${parameter:-word}:如果parameter為空或未定義,則返回為“word";否則,返回parameter的值;
因為變量p有值,直接顯示變量p的的內容;
將變量p撤消,即顯示表達式后面的內容;
${parameter:+word}:如果parameter為空或未定義,則不做任何操作;否則,返回word的值;
此表達式正上面的正好相反,將變量p賦值后顯示表達式后面的字符,即tt;
${parameter:=word}:如果parameter為空或未定義,不但變量返回"word";而且將parameter賦值為word;
變量p中有值時,直接顯示變量p的值,變量p不存在時,將tt賦值給變量p;
${parameter:offset:length}:如果將parameter偏移offset個字符,并截取length長度的字符
在上面的表達式中,設置了偏移3個字符,即從第4個字符開始顯示,截取2個字符,所以結果為45;
${parameter:?word}:如果parameter為空或未定義,則將word做為錯誤信息顯示,否則顯示parameter的值;
為腳本使用配置文件,并確保某變量有可用值的方式:
variable=${variable:-default vaule}
原創文章,作者:petmaster,如若轉載,請注明出處:http://www.www58058.com/2894
有圖有文,每個練習結果均有圖證,看得出其中的認真程度,贊。