shell好像很有用,雖然我不大明白用來干啥的,好像是有很多可以調(diào)用系統(tǒng)參數(shù)的變量,所以適合在Linux寫腳本?
菜鳥教程是用的bash,那我就照著來吧
第一行基本都是#!/bin/sh或者#!/bin/bash打頭,告訴系統(tǒng)腳本用什么解釋器執(zhí)行,然后文件記得加上可執(zhí)行的權(quán)限
另外如果是在當(dāng)前目錄執(zhí)行文件,記得以./開頭,否則回去PATH里面搜索文件,一般是搜索不到的
還有一種腳本執(zhí)行方法是/bin/sh xx.sh,即你的第一行可以省略了,直接運行解釋器執(zhí)行腳本了
變量
變量和PHP差不多,不過不加$符號,變量聲明要記住=左右別加空格了,這和PHP是不一樣的,然后使用變量就要在前面加上$符號
如
name="what";
echo "hello $what";
echo "${what} yet;
和PHP一樣,輸出的時候可以加{}來標(biāo)識變量,以防止和其他字符串混淆
變量是可以修改的,name="so",就把what替換成了so,
另外shell還有只讀變量的設(shè)定,readonly name,這樣就無法進(jìn)行變量的修改了
刪除變量使用unset,unset name就可以刪除了,當(dāng)然如果根據(jù)我寫的一路執(zhí)行下來是會報錯的,因為只讀變量無法刪除
變量類型除了常見的局部變量外,shell沒有全局變量的概念,而是多了環(huán)境變量和shell變量,當(dāng)然局部變量的定義也和其他語法有所區(qū)別
- 局部變量:腳本或者命令行定義,僅在當(dāng)前shell實例中生效
- 環(huán)境變量:所有程序,包括shell啟動的程序都能訪問
- shell變量:由shell程序設(shè)置,一部分是局部變量,一部分是環(huán)境變量
Shell數(shù)據(jù)類型
Shell字符串
單引號和雙引號的區(qū)別和PHP差不多,雙引號里面可以有變量存在,另外,單引號里面單引號不能單獨出現(xiàn),就算是轉(zhuǎn)義字符的單引號也不可以
shell拼接字符串只要往后面寫變量就可以了,不用別的符號"this is"$name,空格加在is后面或者$name前面都是可以生效的
獲取字符串長度用echo ${#name},提取字符串有點類似切片,echo ${name:1:2},輸出ha
查找子字符串可以用echo `expr index "$name" ha`;來實現(xiàn)
Shell數(shù)組
貌似只有索引數(shù)組,沒得關(guān)聯(lián)數(shù)組,鍵是字符串的話,會作為0覆蓋掉,然后可以不使用連續(xù)的下標(biāo)
數(shù)組定義有下面幾種,主要是空格隔開每個值;輸出則是引用下標(biāo),只不過方便的是可以用@全部輸出出來
arr=("a" 1 "b");
arr[0]="what"
arr[1]="so"
echo ${arr[0]}
echo ${arr[@]}
可以用${#arr[@]}或者${#arr[*]}獲取數(shù)組個數(shù),也可以用${#arr[0]}獲取單個元素的長度
Shell注釋
單行注釋用#就可以了,如果是多行注釋,就有點類似PHP的heredoc了
:<<EOF
a
b
c
EOF
EOF是可以用別的替換的,和heredoc區(qū)別主要是開頭是:
Shell傳遞參數(shù)
傳遞參數(shù)只需要在執(zhí)行文件的后面空格+參數(shù)就可以了,譬如./hello.sh 1 2 3,這里就給了三個參數(shù)給腳本。
要在腳本使用參數(shù)則是$+數(shù)字來獲取,不過$0代表的是腳本本身,即./hello.sh,而$1 $2 $3也就是后面所跟隨的參數(shù),如果下標(biāo)溢出,則輸出一個空行(Shell好像沒null這個類型,不知道將這空行理解為空字符串正不正確)
其中幾個特殊字符處理參數(shù),由于都是$開頭,我就省略這個符號了
- #:傳遞到腳本的參數(shù)個數(shù)
- *:把參數(shù)作為字符串一起傳遞,相當(dāng)于輸出
$1$2$3…… - $:腳本運行的當(dāng)前進(jìn)程ID號
- !:后臺運行的最后一個進(jìn)程ID號
- @:顯示和*是一樣的,不過他輸出的是單獨的字符串,相當(dāng)于
"$1""$2""$3"……這樣子 - -:Shell使用的當(dāng)前選項
-
?:顯示最后命令的退出狀態(tài)。0表示沒有錯誤
image.png
