linux的shell有很多種,常見的有bourne shell
bourne again shell
c shell
k shell
shell for root
等,其中bourne again shell
,由於易用和免費,bash在日常工作中被廣泛使用,本系列文章就是基於b shell進行**的
之前所講的的linux命令,例如ls,cat,mkdir等等,都可以在shell裡面得到執行
這裡補充幾個之前沒提到但又比較有用的命令
#!/bin/bash
echo
"hello shell"
以上就是乙個簡單的shell指令碼示例
新建檔案,按約定一般shell指令碼字尾名為sh,這並不是一定的,因為linux對於檔案的識別並不是通過字尾名
字尾名對於linux並沒有作用,這樣寫是為了方便,算是一種行業規定,並非一定
文字開頭的#!
是乙個約定的標記,用來告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種shell
echo 命令用於向視窗輸出文字
shell可以直接執行,也可以作為輸入源來執行
直接執行的話,需要將sh指令碼賦予執行許可權
作為輸入源,需要使用/usr/sh
來執行
前一種方式比較常見
變數說明
在shell中,變數名和其他程式語言類似,變數名遵循字母數字下劃線,數字不能開頭
變數不需要指定型別,定義即可
key=
"test"
這裡有一點值得注意,在其他程式語言中,往往為了美觀,會在賦值號左右加上空格,而在shell中這樣的做法是不可以的
變數賦值
在shell中,變數的賦值有兩種方式
顯示的賦值,例如
key=
"test"
語句賦值,shell可以使用其他語句的結果為變數賦值
for
filein`
ls /etc`
變數使用
使用乙個變數,在變數名前面新增$
符號,表示要獲取這個變數的值
key="test"
echo $key
當變數與其他混合在一起,可以使用{}
定義變數的邊界
key_1="test1"
key_2="test"
echo $
此處如果不對邊界加以區分,那麼編譯器將$
以後當作變數,其輸出的結果就不是預期值了
變數的一些細節
定義過的變數可以重新賦值
這也很好理解,在一般程式語言裡面,變數的定義需要型別,再次賦值則不需要,而在shell裡面是沒有這種規定的,那麼定義乙個變數以後,要修改這個變數的值,那麼只能和定義看上去一樣了,從這個角度來說,有些資料說變數可以重定義,我認為說法是不準確的,這裡準確來說應該是賦值
key=
"test1"
echo
$key
key=
"test2"
echo
$key
唯讀變數與刪除變數
變數可以為唯讀,只需在前面加上readonly即可,唯讀變數的值一旦被定義,那麼就不能修改
key=
"test"
readonly key
變數可以被刪除,使用unset刪除乙個變數
刪除的變數不能再被使用
key=
"test"
unset key
注意:unset不可以刪除唯讀變數
字串可以用單引號,也可以用雙引號,也可以不用引號
單引號單引號類的字元會保持原樣,怎麼寫的就怎麼用
例如存在變數key
,在單引號中存在$key
,那麼他就是乙個$key
,與key變數沒有任何關係
string=
'string test'
反引號一般也用於命令的執行,其等價於$()
雙引號雙引號與單引號最大的區別在於單引號不可以有變數,而雙引號可以,同時還可以存在轉義字元
string=
"string test"
單雙引號都可以對字串進行拼接
key=
" key "
str1=
"test"
$key
"ok"
str2=
"test$ok"
str3=
'test'
$key
'ok'
字串操作string="test"
echo $
string=
"test"
echo
$
string=
"test"
echo
`expr index "$string" es`
bash只支援一維陣列(不支援多維陣列),沒有限定陣列的大小
和其他語言一樣,其可以通過下標來得到陣列值,下標從0開始
定義陣列
陣列名=(值1 值2 ... 值n)
陣列值之間通過空格隔開
testarr=
(1 2 3 4)
其下標可以不連續,沒有範圍限制
$
和一般變數使用類似
key=
$
可以使用*
或@
來獲取陣列中的所用元素
echo
$echo
$
獲取陣列的長度
陣列長度
len=$
len=$
元素長度
len=$
單行注釋
shell通過#
進行注釋
#這是乙個注釋
#這也是乙個注釋
多行注釋
shell中的多行注釋,使用:<<
開始,其後面新增乙個標誌,然後在注釋完成的地方再加乙個同樣的標誌
:<<
eoftest
test
test
eof
shell指令碼在執行的時候可以對其傳遞引數
可以使用$n
對其傳遞的引數接收
例如執行test.sh 1 2 3
,在test.sh
內可以使用$0
代表程式本身,$1
代表第乙個引數
這和c語言main函式的引數接收是一樣的
引數處理
說明$#
傳遞到指令碼的引數個數
$*
以乙個單字串顯示所有向指令碼傳遞的引數
$$
指令碼執行的當前程序id號
$!
後台執行的最後乙個程序的id號
$@
與$*
相同,但是使用時加引號,並在引號中返回每個引數
$-
顯示shell使用的當前選項,與set命令功能相同
$?
顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤
Shell注釋 字串 陣列
shell注釋 sh裡沒有多行注釋,只能每一行加乙個 號。如果遇到大段的 需要注釋,可以把這一段用花括號擴起來,定義成乙個函式,沒地方呼叫這個函式,這塊 就不會執行。shell字串 字串可以用單引號,也可以用雙引號,還可以不用。單引號 單引號裡的任何字元都會原樣輸出,變數是無效的 單引號字串中不能出...
字串變數陣列
定義乙個字串位址的陣列,通過陣列統一處理字串,便於使用完字串之後,統一賦值null 2,賦值以及讀取 for i 0 i 2 i printf s s s n d 0 d 1 d 2 如下 1 include2 include3 char a zhang 4 char b yong 5 char c...
Shell學習之路 03 變數 字串 陣列
1.變數 1.1 常規變數 變數名的命名須遵循如下規則 定義變數時,變數名不加美元符號 如 variablename value 使用乙個定義過的變數,只要在變數名前面加美元符號 即可,可加可不加,如 your name mozhiyan echo your name echo 已定義的變數,可以被...