當前位置:學問君>人在職場>IT認證>

linux shell編程變臉賦值和字元串操作

學問君 人氣:3.29W

1.用戶定義的變量

linux shell編程變臉賦值和字元串操作

用戶定義的變量有字母數字及下劃線組成,並且變量名的第一個字元不能爲數字.

與其它UNIX名字一樣,變量名是大小寫敏感的.

對於變量,用戶可按如下方式賦值:

name = value

在引用變量時,需在前面加$符號,用戶也可以在變量間進行相互賦值,如:

(前面的$是命令提示符)

$ JOHN = john

$ NAME = $JOHN

$ echo Hello $NAME

Hello john

也可以用變量和其他字元組成新的字,這時可能需要把變量用{}括起,如:

$ SAT = Satur

$ echo Today is ${SAT}day

Today is Saturday

對於未賦值的變量,Bash以空值對待,用戶也可以用unset命令清除給變量

賦的值.

Bash中還可以使用數組變量,其賦值有兩種:

(1) name[index] = value

(2) name = (value1 ... valuen) 此時下標從0開始

數組下標的範圍沒有任何限制,同時也不必使用連續的分量.

Bash中關於變量的內建命令有:

(1) declare和typeset.兩者具有一樣的功能.其選項有:

[-/ ]a 設定/撤消變量的數組屬性

[-/ ]i 設定/撤消變量的整數屬性

[-/ ]r 設定/撤消變量的只讀屬性

[-/ ]x 設定/撤消變量的輸出屬性

-p var 顯示變量屬性

(2) export和local.

export把變量輸出到環境中,用法爲:

export name

export name = value

這裏需要簡單介紹一下export的作用:當Bash shell執行一個

程序時,將首先爲該程序建立一個新的執行環境,稱爲子shell,

在Bash Shell中變量都是局部的,即它們只是在創建它們的子

Shell中是有意義的,使用export後,變量被設定爲全局變量,這

時可以被其它子Shell所識別

local標記變量爲局部的.(如只能被函數內部使用),用法爲:

local name

local name = value

(3) readonly.

指定變量爲只讀,執行後,改變量不能被再次賦值,用法爲:

readonly name

2.位置變量或Shell參數

Bash Shell在解釋用戶命令時,將把命令行的第一個子作爲命令,而其它字作爲

參數透過位置變量傳遞給程序.$1,...,$9分別代表第一,...,九個參數.其中1-9

是真正的參數名,"$"符只是用來標識變量的替換.

位置變量$0指命令對應的可執行名.

其它的還有:

$# 送給命令的參數個數

$@ 所有的參數,每個用雙括號括起

$* 所有的參數,用雙括號括起

3.與Shell有關的變量

(1) Shell自身設定的一些常用變量:

LINENO 正在執行的命令在腳本中的行號

PWD 用戶當前目錄的全名

OLDPWD 最近一次執行cd之前,用戶當前目錄的全名

PPID 父進程ID

$ 當前進程ID

RANDOM 隨機數(範圍0-32767)

SECONDS Bash Shell的執行時間,單位是秒

REPLY select和read命令使用,以後會講到

OPTARG

ORTIND 這兩個變量由getopt命令設定

UID 當前用戶的User ID

_ 上一條命令使用的最後一個參數

(2) 影響Shell行爲的一些常用環境變量:

PATH 命令搜尋路徑,以冒號爲分隔符.注意與DOS下不同的是,

當前目錄不在系統路徑裏

HOME 用戶home目錄的路徑名,是cd命令的默認參數

COLUMNS 定義了命令編輯模式下可使用命令行的長度

EDITOR 默認的行編輯器

VISUAL 默認的可視編輯器

FCEDIT 命令fc使用的編輯器

HISTFILE 命令歷史檔案

HISTSIZE 命令歷史檔案中最多可包含的命令條數

HISTFILESIZE 命令歷史檔案中包含的最大行數

IFS 定義SHELL使用的分隔符

LOGNAME 用戶登入名

MAIL 指向一個需要SHELL監視其修改時間的檔案.當該檔案修改後,

SHELL將發消息You hava mail給用戶

MAILCHECK SHELL檢查MAIL檔案的週期,單位是秒

MAILPATH 功能與MAIL類似.但可以用一組檔案,以冒號分隔,每個檔案後

可跟一個問號和一條發向用戶的消息

SHELL SHELL的路徑名

TERM 終端類型

TMOUT SHELL自動退出的時間,單位爲秒,若設爲0則禁止SHELL自動退出

PROMPT_COMMAND 指定在主命令提示符前應執行的命令

PS1 主命令提示符

PS2 二級命令提示符,命令執行過程中要求輸入數據時用

PS3 select的命令提示符

PS4 調試命令提示符

MANPATH 尋找手冊頁的路徑,以冒號分隔

LD_LIBRARY_PATH 尋找庫的路徑,以冒號分隔

bash變量賦值

例子:經常在configure腳本中,會出現以下類似的語句,都表示什麼意思呢?

if test -n "${ZSH_VERSION set}"; then

ac_env_build_alias_set=${build_alias set}

test "${ac_configure_args0 set}" != set

答案及擴展:

變量賦值方式

str 沒有賦值

str 爲空字元串

str 爲非空字元串

備註

var=${str-expr}var=exprvar=$strvar進行設定
var=${str expr}var=$strvar=exprvar進行設定,varstr要不都取值,要不都不取值。雖然取值不同
var=${str=expr}str=expr
var=expr
str 不變
var=$str
varstr進行設定,

var str保持一致

var=${str?expr}expr 輸出至 stderrvar=strvar進行設定
var=${str:-expr}var=exprvar=$str 
var=${str: expr}var=var=expr 
var=${str:=expr}str=expr
var=expr
str 不變
var=$str
 
var=${str:?expr}expr 輸出至 stderr

Bash字元串的操作

(一)字元串的替換

(1)

${變量1/查找字元/替換字元}

(說明一下,這個操作中除了第一個參數是變量外其它兩個都是字元;還有一點就是這個操作並不是把“變量1”中的字元替換了,詳見例子)

例:

str1=abcABCabc123ABC

echo ${str1/bcA/aaa}#這裏的abc和aaa都是字元串,而str1是變量,並且這個操作過後str1裏的字元串長度不會減少,只是產生了一個 新的字串。

(2)

${變量1/#查找字元/替換字元}

(說明一下,這個操作上和麪的是一樣的,只不過是從左邊開始匹配,並且必須從左邊第一個字元開始)

例:

echo ${str1/#bcA/aaa}#這個例子中並不會把bcA換成aaa因爲b不是左邊第一個開頭字元

echo ${str1/#abc/aaa}#這樣才行

(3)

${變量1/%查找字元/替換字元}

(與(2)相反,是結尾最後一個字元要匹配才行)

例:

echo ${str1/:BC/aaa}#abcABCabc12aaa

(3)

${變量1//查找字元/替換字元}

全部替換

(二)取子串

(1)${變量1:位置}

(說明一下,默認是從左邊開始,如果“位置”爲負數,則是從右邊的第“位置”個字元開始,並且第一個位置爲0;從“位置”開始取子串到最後)

例:

str1=abcABCabc123ABC

echo ${str1:(-3)}#會輸出ABC

(2)${變量1:開始位置:結束位置}

(3)如果“變量1”爲“*”或“@”,“位置”所表示的是第幾個參數。

(三)字元串移動

(1)${字串#匹配字串}

(說明一下,這個是從左邊第一個開始匹配,剝去最短“匹配字串”)

例:

str1=abcABCabc123

echo ${str1#a*c}#輸出ABCabc123

(2)${字串##匹配字串}

(說明一下,這個是從左邊第一個開始匹配,剝去最長“匹配字串”)

str1=abcABCabc123

echo ${str1#a*c}#輸出123

echo ${str1#b*c}#輸出abcABCabc123,因爲沒有從第一個開始匹配

(3)${字串%匹配字串}

(4)${字串%%匹配字串}

(說明一下,這與上面的(1)(2)是正好相反的,是從最後一個開始匹配的)

(四)字元串長度

${#字串}

例:

str=abcdefg

echo ${#str}#輸出7