shell腳本有sh、bash、ksh、csh、zsh等等,不一樣的shell腳本都有本身的特色,但用法是差很少的,Mac自帶shell,能夠用cat /etc/shells
去查看,本文爲Windows環境中使用bash。html
因此只要有規律可循的操做均可以用shell去嘗試一下,大大提升搬磚效率。linux
新建一個test.sh的記事本,擴展名爲 sh(sh表明shell),輸入如下內容:git
#!/bin/bash
echo 'hello world!'
複製代碼
第一行的#!是一個約定標記,指定這裏使用bash這個解釋器來解釋這個腳本,這一行通常必須寫明。 第二行的echo命令是在屏幕上輸出hello world!。web
./test.sh
執行腳本;注意:必定要寫成./test.sh
,不能夠寫成test.sh
,目的是用 ./test.sh 告訴系統說,就在當前目錄找,否則寫成 test.sh 是會找不到命令的。正則表達式
到這裏一個最簡單的shell腳本就完成了,接下來就來看看更深刻一點的內容吧!shell
定義變量時,變量名不加美圓符號$,如:編程
name=chenying
複製代碼
須要注意的是,和別的語言不同的是:變量名和等號之間不能有空格。數組
使用一個定義過的變量,只要在變量名前面加美圓符號後的花括號,加不加均可,但仍是建議加上,養成一個好的編程習慣,如:bash
name=chenying
echo $name
echo ${name}
複製代碼
shell變量分爲局部變量(變量前面加local)和全局變量(變量前面不添加),局部變量的可見範圍是代碼塊或函數內,全局變量則全局可見,和別的語言相似。函數
字符串能夠用單引號,也能夠用雙引號。
區別:
單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的,也不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,做爲字符串拼接使用。
雙引號裏能夠有變量,雙引號裏能夠出現轉義字符。
單引號栗子:
str='this is a string'
複製代碼
雙引號栗子:
name='Isabella'
str="Hello, I know you are \"$name\"! \n"
echo -e $str
複製代碼
其中, echo -e 表示使用轉義功能。
name='Isabella'
#使用雙引號拼接
a="hello, "$name" !"
b="hello, ${name} !"
echo $a $b
#使用單引號拼接
a1='hello, '$name' !'
b1='hello, ${name} !'
echo $a1 $b1
複製代碼
輸出結果
hello, Isabella ! hello, Isabella !
hello, Isabella ! hello, ${name} !
複製代碼
string="Isabella"
echo ${#string} #輸出 8
複製代碼
此栗子從字符串第 3 個字符開始截取 6 個字符:
string="Corgi is so cute!"
echo ${string:2:6} # 輸出 rgi is
複製代碼
查找字符 i 或 o 的位置(哪一個字母先出現就計算哪一個):
string="Corgi is so cute!"
echo `expr index "$string" io` # 輸出 2
複製代碼
腳本內獲取參數的格式爲:$n。n 表明一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推。 栗子:
#!/bin/bash
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";
複製代碼
執行./test.sh a b c
,輸出結果爲:
第一個參數爲:a
第二個參數爲:b
第三個參數爲:c
複製代碼
工做應用場景:
#!/bin/bash
# 從傳參獲取分支名
branch=${1}
if [ ${#branch} = 0 ]
then
echo "請輸入分支名"
exit 1
fi
echo ${branch}
# 子模塊路徑
subPath="d:/projects/web-ac-course-new-ngk0/src/input/dist/"
# 切換到子模塊目錄
cd ${subPath}
#切換到當前傳參的分支
git checkout ngk0-${branch}
複製代碼
執行./test.sh 221
,輸出結果爲:
221
Switched to branch 'ngk0-221'
Your branch is up to date with 'origin/ngk0-221'.
複製代碼
原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操做。
加+ 減- 乘* 除/ 取餘% 賦值= 相等== 不相等!=
求和栗子:
#!/bin/bash
val=`expr 1 + 1`
echo "兩數之和爲 : $val" #輸出結果:2
複製代碼
注:
1+1
是不對的,必須寫成1 + 1
;算術運算符栗子:
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等於 b"
fi
if [ $a != $b ]
then
echo "a 不等於 b"
fi
複製代碼
輸出結果:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等於 b
複製代碼
還有關係運算符、布爾運算符、邏輯運算符、字符串運算符、文件測試運算符可參考菜鳥教程shell運算符
語法格式
if condition
then
command1
command2
...
commandN
fi
複製代碼
栗子
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '兩個數字相等!'
else
echo '兩個數字不相等!'
fi # 兩個數字相等!
複製代碼
語法格式
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
複製代碼
栗子
#判斷兩個變量是否相等
a=10
b=20
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 b"
else
echo "沒有符合的條件"
fi # a 小於 b
複製代碼
語法格式
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
複製代碼
數字型循環
#1
for((i=1;i<=10;i++));
do
echo $(expr $i \* 3 + 1);
done
#2
for i in $(seq 1 10)
do
echo $(expr $i \* 3 + 1);
done
#3
for i in `seq 10`
do
echo $(expr $i \* 3 + 1);
done
#4
for i in {1..10}
do
echo $(expr $i \* 3 + 1);
done
複製代碼
字符型循環
#遍歷出當前文件目錄中的文件名
for i in `ls`;
do
echo $i is file name\! ;
done
#遍歷出空格先後的內容
list="corgi is so cute !"
for i in $list;
do
echo $i is block ;
done
複製代碼
語法格式
while condition
do
command
done
複製代碼
until 循環執行一系列命令直至條件爲 true 時中止,與 while 循環在處理方式上恰好相反。 語法格式
until condition
do
command
done
複製代碼
shell case語句爲多選擇語句。能夠用case語句匹配一個值與一個模式,若是匹配成功,執行相匹配的命令,語法格式:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac #須要一個esac(就是case反過來)做爲結束標記,每一個case分支用右圓括號,用兩個分號表示break
複製代碼
在循環過程當中,有時候須要在未達到循環結束條件時強制跳出循環,Shell使用兩個命令來實現該功能:break和continue。
簡化寫法中function能夠不寫,語法格式
function name() {
statements
[return value]
}
複製代碼
工做中應用場景:
# 提交代碼
function pushCode() {
git add .
git commit -m 'feat: 新增視頻語音包'
git pull
git push
}
pushCode
複製代碼
grep擅長查找功能,sed擅長取行和替換。awk擅長取列。
語法
grep [OPTIONS] PATTERN [FILE...]
複製代碼
注:這裏的模式,要麼是字符(串),要麼是正則表達式。
grep經常使用選項以下:
選項 | 含義 |
---|---|
-c | 僅列出文件中包含模式的行數。 |
-i | 忽略模式中的字母大小寫。 |
-l | 列出帶有匹配行的文件名。 |
-n | 在每一行的最前面列出行號。 |
-v | 列出沒有匹配模式的行。 |
-w | 把表達式當作一個完整的單字符來搜尋,忽略那些部分匹配的行。 |
栗子:
一、在指定文件(dataPath="d:/projects/web-ac-course-new-ngk2/src/input/dist/data.js"
)中查找並打印包含"PureImage"的行
grep "PureImage" ${dataPath}
複製代碼
輸出結果
dataList.PureImage = {
複製代碼
二、忽略大小寫搜索(-i)
grep -i "pureiimage" ${dataPath}
複製代碼
輸出結果
dataList.PureImage = {
複製代碼
三、統計字符串出現的次數(-c)
grep -c "show" ${dataPath} #17
grep -n "show" ${dataPath}
複製代碼
-n 能夠列出匹配的字符串所在行號以及所在行內容。
四、高亮顯示匹配內容(--color)
grep --color "PureImage" ${dataPath}
複製代碼
五、雙重條件匹配 匹配當前目錄中包含float的文件並高亮。
ls *.html | grep --color "float"
複製代碼
語法
sed [option]... 'script' inputfile
複製代碼
sed經常使用選項以下:
選項 | 含義 |
---|---|
-e | 能夠在同一行裏執行多條命令 |
-f | 後跟保存了sed指令的文件 |
-i | 直接對內容進行修改,不加-i時默認只是預覽,不會對文件作實際修改 |
-n | sed默認會輸出全部文本內容,使用-n參數後只顯示處理過的行 |
sed經常使用編輯命令:
命令 | 含義 |
---|---|
a | 向匹配行後面插入內容 |
i | 向匹配行前插入內容 |
c | 更改匹配行的內容 |
d | 刪除匹配的內容 |
s | 替換掉匹配的內容 |
p | 打印出匹配的內容,一般與-n選項一塊兒使用 |
栗子:
一、一行命令替換多處內容,不加-e只能替換第一處的內容
sed -e 's/abc/qqq/g' -e 's/123/999/g' data.js
複製代碼
二、向文件中添加或插入行(a/i)
#在第2行後添加hello
sed '2ahello' data.js
複製代碼
#向匹配內容123後面添加hello,若是文件中有多行包括123,則每一行後面都會添加
sed '/123/ahello' data.js
複製代碼
#最後一行添加hello
sed '$ahello' data.js
複製代碼
在匹配內容以前插入只需把a換成i
三、替換匹配行內容(c)
#把文件的第1行替換爲hello
sed '1chello' data.js
複製代碼
四、刪除匹配行(d)
#刪除第2行
sed '2d' data.js
複製代碼
#從第一行開始刪除,每隔2行就刪掉一行,即刪除奇數行
sed '1~2d' data.js
#刪除1~2行
sed '1,2d' data.js
#刪除1~2以外的行
sed '1,2!d' data.js
#刪除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
sed '/123\|abc/!d' data.js
複製代碼
五、替換文件中的內容(s)
#替換每行第1個123爲hello
sed 's/123/hello/' data.js
#替換每行第2個123爲hello
sed 's/123/hello/2' data.js
#替換,後面的內容爲空
sed 's/,.*//g' data.js
複製代碼
以上這些栗子都不會修改原文件,通常這些命令都是配合sed選項來用,如想修改原文件須要加上-i這個選項,不然只是預覽效果。
awk支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。 語法
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
複製代碼
經常使用選項
選項 | 含義 |
---|---|
-F fs | fs 指定輸入分隔符,fs能夠時字符串或正則表達式 |
-v var=value | 賦值一個用戶定義變量,將外部變量傳遞給awk |
-f scriptfile | 從腳本文件中讀取awk命令 |