首先強調一下,bourne shell資料型別的概念極簡單:一切變數的值,都是字串。所以,也可以認為,bourne shell只有一種基本資料型別,那就是字串。
由於資料型別太簡單,所以指令碼中若要進行各種數**算,只能借助其他程式(例如,expr程式)來完成。其他程式計算出的結果,在指令碼中仍然儲存為乙個字串。
唯一例外的是陣列,他是一組字串的集合。
指令碼第一行固定為如下內容
#!/bin/sh
他表示這是乙個直譯器檔案,由程式/bin/sh來解釋執行。當然,若實際環境中sh程式不在這個路徑,則調整一下即可。
好了,下面開始進入正文。
0. 變數賦值及引用
給變數賦值
var_name=expression
例如:
a=1a=hello
a="hello world!" #值為多個單詞時,需要用引號括一下
引用變數的值
$ 或者 $var_name
1. 命令列引數
以如下命令行為例
***.sh a b c
$0 表示命令行中最左邊的這部分,即用相對路徑或絕對路徑表示的指令碼檔案的路徑。
實際執行時,這裡是什麼,就是什麼。他就是原原本本的shell指令碼的路徑。
$# 表示引數的個數,不包括$0本身。本例中,$#為3,即3個引數:a b c。
$1 $2 $3 ......表示具體的引數。這裡他們分別對應a b c
最後,對於函式的引數,$#與$1 $2 $3 ......,含義完全同上。
同時,對於函式來說,$0的值並不是函式名,而是與指令碼執行命令列引數中的$0一致。
2. 儲存命令執行的標準輸出到變數中
a=`/path/to/program [params ...]`
注意,不管命令的輸出中是否包含分隔開的單詞,整個結果都做為乙個字串儲存到了變數中。
這個對於儲存函式執行的標準輸出也一樣適用。語法也一樣。
a=`function [params ...]`
3. 陣列相關
注意,所有相關的值,還是和變數的值型別一樣,都是字串。
建立陣列 a=(1 2 3 4 5)
陣列元素個數 $ #值為5
引用元素
$ #注意,陣列下標i從0開始
元素賦值 a[i]=100
引用整個陣列的內容
$ 或者 $ #
值為1 2 3 4 5
最後注意一下,這裡陣列a的賦值比較規範。實際情況下,括號內的內容,可以是一組用分隔符(可以是空格,換行符)隔開的單詞(例如 ls 命令的執行結果)。
賦值後,每個單詞就是陣列的乙個元素,乾乾淨淨的,不包含分隔符本身。如果兩個單詞之間有多個分隔符,效果還是等於乙個分隔符。
4. 分支語法
(i)if語句
if [ expression ]; then
...elif [ expression ]; then
...else
...fi
(ii)for迴圈
item_list="1 2 3 4 5" 或者引用前面的陣列生成條目列表 item_list=$
for i in $;
doecho $i
done
5. sed引用shell變數
示例如下。唯一要注意的是,要使用雙引號,不能使用單引號。
sed "s/something/$/g" a.txt
6. awk引用shell變數
示例如下。
echo 1 2 3 | awk ''
程式設計雜記2
1.編譯的時候輸出資訊 pragma message compiling threadmodel.h.2.作業系統版本不對輸出出錯資訊 ifndef windows error windows.h should be included first endif 3.interlockedincreme...
程式設計學習雜記
c語言,c 裡面全域性變數 包括陣列 編譯器自動賦初值為零.define mymax a,b a b?a b getline cin,b getline 就是遇到 n就停止,將 n前面的給讀入,同時捨棄 n but,cin讀字串的時候,會捨棄最前面的空白字元,同時遇到空白字元就停止,返回空白字元前面...
雜記 《C 程式語言》
1.類定義可以由於 include的使用而在不同原始檔裡重複出現,這樣並不違反唯一定義規則 2.class的const成員函式不能修改class 成員變數 3.對於const或者非const物件都可以呼叫const成員函式,而非const成員函式則只能對非const物件呼叫 p205 4.在類x的非...