第一章 shell程式設計

2021-08-22 08:27:42 字數 4035 閱讀 1002

shell的變數分為兩種環境變數和本地變數

檢視環境變數 env:

列印環境變數:printenv

本地變數:

新建本地變數:

diner='eqewqeqe'
注意:新建本地變數是,等行前後不能加空格,要不然會出錯。

檢視本地變數:

set | grep "diner"
本地變數匯入到環境變數:

export diner

env | grep "diner"

定義環境變數:

export eee=『ddd』
刪除乙個已定義的環境變數或者本地變數

unset diner
檢視當前的shell型別:

echo $shell
shell 中取值時需要加$:

diner=aaa

echo $diner

輸出結果為aaa。

也可以用大括號$ == $diner

var=45

echo $var+3

這個顯示結果是:

45+3
實際上,var是乙個字串。

萬用字元

* 匹配0個或多個任意字元

? 匹配乙個任意字元

[若干字元] 匹配方括號中任意乙個字元的一次出現。

由'`'反引號括起來的也是一條命令,shell先執行該命令,然後將輸出結果立刻代換到當前命令列中。例如定義乙個變數存放date命令的輸出:

date=`date`

echo $date

命令代換也可以用$()表示:

date=$(date)
用於算術計算,$(())中的shell變數取值將轉換成整數,同樣含義的$等價例如:

var=45

echo $(($var+3))

$(())中只能用+-*/和()運算子,並且只能做整數運算。

$[base#n],其中base表示進製,n按照base進製解釋,後面再有運算數,按十進位制解釋。

echo $[2#10+11]

echo $[8#10+11]

echo $[10#10+11]

和c語言類似,\在shell中被用作轉義字元,用於去除緊跟其後的單個字元的特殊意義(回車除外),換句話說,緊跟其後的字元取字面值。例如:

echo $shell

/bin/bash

echo \$shell

$shell

echo \\

\

比如建立乙個檔名為「$ $」的檔案可以這樣:

touch \$\ \$
還有乙個字元雖然不具有特殊含義,但是要用它做檔名也很麻煩,就是-號。如果要建立乙個檔名以-號開頭的檔案,這樣是不行的:

touch -hello

touch: invalid option -- h

try `touch --help' for more information.

即使加上\轉義也還是報錯:

touch \-hello

touch: invalid option -- h

try `touch --help' for more information.

因為各種unix命令都把-號開頭的命令列引數當作命令的選項,而不會當作檔名。如果非要處理以-號開頭的檔名,可以有兩種辦法:

touch ./-hello
或者

touch -- -hello
ls \

> -l

(ls -l命令的輸出)

和c語言不一樣,shell指令碼中的單引號和雙引號一樣都是字串的界定符(雙引號下一節介紹),而不是字元的界定符。單引號用於保持引號內所有字元的字面值,即使引號內的\和回車也不例外,但是字串中不能出現單引號。如果引號沒有配對就輸入回車,shell會給出續行提示符,要求使用者把引號配上對。例如:

echo '$shell'

$shell

echo 'abc\(回車)

> de'(再按一次回車結束命令)

abc\

de

被雙引號用括住的內容,將被視為單一字串。它防止萬用字元擴充套件,但允許變數擴充套件。這點與單引號的處理方式不同

date=$(date)

echo "$date"

echo '$date'

命令test或[可以測試乙個條件是否成立,如果測試結果為真,則該命令的exit status為0,如果測試結果為假,則命令的exit status為1(注意與c語言的邏輯表示正好相反)。例如測試兩個數的大小關係:

var=2

test $var -gt 1

echo $?

返回值為真,為0。

test $var -gt 3

echo $?

返回值為1;為假。

[ $var -gt 3 ]

echo $?

返回值為假。

雖然看起來很奇怪,但左方括號[確實是乙個命令的名字,傳給命令的各引數之間應該用空格隔開,比如,$var、-gt、3、]是[命令的四個引數,它們之間必須用空格隔開。命令test或[的引數形式是相同的,只不過test命令不需要]引數。以[命令為例,常見的測試命令如下表所示:

[ -d dir ]              如果dir存在並且是乙個目錄則為真

[ -f file ]             如果file存在且是乙個普通檔案則為真

[ -z string ]           如果string的長度為零則為真

[ -n string ]           如果string的長度非零則為真

[  $string1 =$ string2 ]   如果兩個字串相同則為真

[ $string1 !=$ string2 ]  如果字串不相同則為真

[ $arg1 op $arg2 ]        arg1和arg2應該是整數或者取值為整數的變數,op是-eq(等於)-ne(不等於)-lt(小於)-le(小於等於)-gt(大於)-ge(大於等於)之中的乙個

和c語言類似,測試條件之間還可以做與、或、非邏輯運算:

帶與、或、非的測試命令

[ ! expr ] expr可以是上表中的任意一種測試條件,!表示邏輯反

[ expr1 -a expr2 ] expr1和expr2可以是上表中的任意一種測試條件,-a表示邏輯與

[ expr1 -o expr2 ] expr1和expr2可以是上表中的任意一種測試條件,-o表示邏輯或

$ var=abc

$ [ -d desktop -a $var = 'abc' ]

$ echo $?

0

注意,如果上例中的$var變數事先沒有定義,則被shell展開為空字串,會造成測試條件的語法錯誤(展開為[ -d desktop -a = 'abc' ]),作為一種好的shell程式設計習慣,應該總是把變數取值放在雙引號之中(展開為[ -d desktop -a "" = 'abc' ]):

$ unset var

$ [ -d desktop -a $var = 'abc' ]

bash: [: too many arguments

$ [ -d desktop -a "$var" = 'abc' ]

$ echo $?

1

第一章 Shell程式設計基礎

第一章 shell程式設計基礎 1 shell概述 shell是作業系統的外殼,是使用者使用作業系統的命令介面 shell接受使用者以命令列方式輸入的命令,也能解釋執行由shell命令編寫的shell程式 2 shell基礎知識 1 區分大小寫 變數var和var是不同的變數 2 注釋 在指令碼的第...

第一章 Shell程式設計規範與變數

1第一章 shell程式設計規範與變數 shell指令碼 指令碼編寫規範 bin bash 宣告指令碼使用的直譯器名稱 開發人額遠 生產日期 開頭的表示注釋資訊,可以和命令語句配合使用,用於註明命令語句 ls root echo 123 命令語句,指令碼正真會實行的內容 執行方法 注意指令碼執行之前...

程式設計珠璣第一章

原文中的問題 如何在1mb的空間裡面對一千萬個整數進行排序?並且每個數都小於1千萬。實際上這個需要1.25mb的記憶體空間。1mb總共有838,8608。所以估計也可以在1mb左右的空間裡面進行排序了。include include define bitsperword 32 define shif...