shell腳本快速入門

shell腳本類別

shell腳本有sh、bash、ksh、csh、zsh等等,不一樣的shell腳本都有本身的特色,但用法是差很少的,Mac自帶shell,能夠用cat /etc/shells去查看,本文爲Windows環境中使用bash。html

shell腳本能作什麼?

  1. 將一些複雜的命令簡單化(平時咱們提交一次代碼可能須要不少步驟,可是能夠用Shell簡化成一步);
  2. 解決不少重複性操做(好比屢次修改相同的文件內容);
  3. 自動打包、編譯、發佈等功能;

因此只要有規律可循的操做均可以用shell去嘗試一下,大大提升搬磚效率。linux

第一個shell腳本

新建一個test.sh的記事本,擴展名爲 sh(sh表明shell),輸入如下內容:git

#!/bin/bash
echo 'hello world!'
複製代碼

第一行的#!是一個約定標記,指定這裏使用bash這個解釋器來解釋這個腳本,這一行通常必須寫明。 第二行的echo命令是在屏幕上輸出hello world!。web

如何運行

  1. 在git bash中進入到test.sh所在文件夾目錄;
  2. 輸入./test.sh執行腳本;

注意:必定要寫成./test.sh,不能夠寫成test.sh,目的是用 ./test.sh 告訴系統說,就在當前目錄找,否則寫成 test.sh 是會找不到命令的。正則表達式

運行結果:

運行結果

到這裏一個最簡單的shell腳本就完成了,接下來就來看看更深刻一點的內容吧!shell

shell 變量

定義變量時,變量名不加美圓符號$,如:編程

name=chenying
複製代碼

須要注意的是,和別的語言不同的是:變量名和等號之間不能有空格數組

使用一個定義過的變量,只要在變量名前面加美圓符號便可,至於後的花括號,加不加均可,但仍是建議加上,養成一個好的編程習慣,如:bash

name=chenying
echo $name
echo ${name}
複製代碼

shell變量分爲局部變量(變量前面加local)和全局變量(變量前面不添加),局部變量的可見範圍是代碼塊或函數內,全局變量則全局可見,和別的語言相似。函數

shell 字符串

字符串能夠用單引號,也能夠用雙引號。

區別

單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的,也不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,做爲字符串拼接使用。

雙引號裏能夠有變量,雙引號裏能夠出現轉義字符。

單引號栗子:

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
複製代碼

shell 傳遞參數

腳本內獲取參數的格式爲:$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'.

複製代碼

shell 基本運算符

原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操做。

算術運算符

加+ 減- 乘* 除/ 取餘% 賦值= 相等== 不相等!=

求和栗子:

#!/bin/bash 
val=`expr 1 + 1`
echo "兩數之和爲 : $val" #輸出結果:2
複製代碼

注:

  1. 表達式和運算符之間要有空格,例如 1+1 是不對的,必須寫成1 + 1
  2. 整的表達式要被 ` ` 包含;

算術運算符栗子:

#!/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運算符

shell 流程控制

if else

語法格式

if condition
then
    command1 
    command2
    ...
    commandN 
fi
複製代碼

栗子

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '兩個數字相等!'
else
    echo '兩個數字不相等!'
fi # 兩個數字相等!
複製代碼

if else-if else

語法格式

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 循環

語法格式

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 語句

語法格式

while condition
do
    command
done
複製代碼

until 循環

until 循環執行一系列命令直至條件爲 true 時中止,與 while 循環在處理方式上恰好相反。 語法格式

until condition
do
    command
done
複製代碼

case

shell case語句爲多選擇語句。能夠用case語句匹配一個值與一個模式,若是匹配成功,執行相匹配的命令,語法格式:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac #須要一個esac(就是case反過來)做爲結束標記,每一個case分支用右圓括號,用兩個分號表示break
複製代碼

跳出循環

在循環過程當中,有時候須要在未達到循環結束條件時強制跳出循環,Shell使用兩個命令來實現該功能:break和continue。

shell 函數

簡化寫法中function能夠不寫,語法格式

function name() {
    statements
    [return value]
}
複製代碼

工做中應用場景:

# 提交代碼
function pushCode() {
    git add .
    git commit -m 'feat: 新增視頻語音包'
    git pull
    git push
}
pushCode
複製代碼

Linux 三劍客簡單介紹(grep、sed、awk)

grep擅長查找功能,sed擅長取行和替換。awk擅長取列。

1. grep

語法

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"
複製代碼

2. sed

語法

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這個選項,不然只是預覽效果。

3. awk

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命令
相關文章
相關標籤/搜索