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...