Shell 腳本

環(huán)境聲明

#!/bin/bash or #!/bin/sh or #!/usr/bin/env bash

文件擴展名

Shell腳本擴展名為.sh ,如 test.sh

執(zhí)行腳本

執(zhí)行權(quán)限

chmod +x file ,如 chmod +x ./test.sh

運行

./test.sh

變量

定義變量

a=12_var="apple"

使用變量

$a${_var}

只讀變量

readonly var

字符串

單引號
  • 單引號內(nèi)的任何字符都會原樣輸出,單引號字符串中的變量是無效的
  • 單引號內(nèi)可成對出現(xiàn)單引號,作為字符串拼接使用
雙引號
  • 可以有變量
  • 可以出現(xiàn)轉(zhuǎn)義字符
字符串長度

${#var}

str="Money"
echo ${#str}
提取字符串

${var:index:count}

str="Monkey"
echo ${str:0:3}
查找字符串

expr index String subString

str="I have an apple."
echo `expr index "$str" a`

數(shù)組

定義數(shù)組

array=(a b c)

讀取數(shù)組
  • 獲取第一個元素 ${array[0]}
  • 獲取所有元素 ${array[@]}

傳遞參數(shù)

  • $0 執(zhí)行的文件名
  • $1 第一個參數(shù),以此類推
  • $# 參數(shù)個數(shù)
  • $* 以一個單字符串顯示所有參數(shù);相當(dāng)于傳遞一個參數(shù)
  • $@$*類似,但是使用時加引號;相當(dāng)于傳遞所有參數(shù)
  • $$ 腳本運行的當(dāng)前進程號

運算符

算術(shù)運算符

使用 expr 命令

  • + - * / % = 加、減、乘、除、取余、賦值
  • == != 相等、不相等
關(guān)系運算符

只支持?jǐn)?shù)字

  • -eq 相等 equal
  • -ne 不相等 not equal
  • -gt 大于 greater than
  • -lt 小于 less than
  • -ge 大于等于 greater and equal
  • -le 小于等于 less and equal
布爾運算符
  • ! 非運算
  • -o 或運算 or
  • -a 與運算 and
邏輯運算符
  • && AND
  • || OR
字符串運算符
  • = 相等
  • != 不相等
  • -z 字符串長度為0,返回true
  • -n 字符串長度不為0,返回true
  • str 字符串不為空,返回true
文件測試運算符
  • -b 檢測文件是否塊設(shè)備文件,是則返回true
  • -c 檢測文件是否字符設(shè)備文件,是則返回true
  • -d 檢測文件是否目錄,是則返回true
  • -f 檢測文件是否普通文件 (不是目錄,也不是設(shè)備文件),是則返回true
  • -r 檢測文件是否可讀,是則返回true
  • -w 檢測文件是否可寫,是則返回true
  • -x 檢測文件是否可執(zhí)行,是則返回true
  • -s 檢測文件是否為空(文件大小是否大于0),不為空則返回true
  • -e 檢測文件(包括目錄)是否存在,是則返回true

輸出

開啟轉(zhuǎn)義

echo -e "Good~ \n"

顯示結(jié)果定向至文件

echo "Hello World" > file 覆蓋文件內(nèi)容

echo "Hello World" >> file 追加內(nèi)容

顯示命令執(zhí)行結(jié)果

echo `date`

格式化輸出

使用 printf 命令

printf [format] [arguments...]

參數(shù)說明

  • -d 十進制整數(shù)
  • -s 字符串
  • -c 字符
  • -f 浮點數(shù)
printf "%-10s %-7s %3s %6s\n" Name Sex Age Score
printf "%-10s %-7s %3d %6.2f\n" Jack Male 27 82.3
printf "%-10s %-7s %3d %6.2f\n" Jennifer Female 25 91.62
printf "%-10s %-7s %3d %6.2f\n" Tom Male 56 96.372

輸入

使用 read 命令

  • 該命令一個一個詞組接受輸入的參數(shù),每個詞組需要使用 空格 進行分隔,以 回車鍵 結(jié)束輸入;
  • 如果輸入詞組個數(shù)小于需要的參數(shù)個數(shù),則沒賦值的參數(shù)為空;
  • 如果輸入詞組個數(shù)大于需要的參數(shù)個數(shù),則多出來的詞組將作為整體為最后一個參數(shù)被接收。

參數(shù)說明

  • -p 輸入提示文字
  • -n 輸入字符長度限制,達到限制長度自動結(jié)束輸入
  • -t 輸入限時,單位是秒
  • -s 隱藏輸入內(nèi)容
read -p "Please input your password within 10 seconds: " -n 6 -t 10 -s password
echo -e "\nYour password is: $password"

流程控制

條件判斷
if condition
then
    command 
    ...
fi

or

if condition
then
    command1
else
    command2
fi

or

if condition1
then
    command1
elif condition2
then
    command2
else
    command3
fi
for 循環(huán)
for var in item ... itemN
do
    command
    ...
done
while 循環(huán)
while condition
do
    command
done
until 循環(huán)

until 循環(huán)執(zhí)行一系列命令直至條件為true時停止

until condition
do
    command
done
case
case value in
item1)
    command1
    ;;
item2)
    command2
    ;;
*)
    commandN
    ;;
esac
break

跳出所有循環(huán)

continue

跳出當(dāng)前循環(huán)

常用命令

清空終端

clear

創(chuàng)建文件

touch file

創(chuàng)建目錄

mkdir dir

查看文件內(nèi)容

cat file

顯示指定工作目錄下的內(nèi)容

ls [-alrtAFR] [name...]

參數(shù)說明

  • -a 顯示所有文件及目錄
  • -A-a ,但不列出當(dāng)前目錄 . 及 父目錄 ..
  • -l 顯示文件詳細信息
  • -r 以相反次序顯示
  • -t 按創(chuàng)建時間先后次序顯示
  • -F 在文件后加符號,可執(zhí)行文件加 * ,目錄加 `/``
  • -R 顯示子目錄下文件
改名、移動文件或目錄

mv [options] src destmv [options] src... dir

參數(shù)說明

  • -i 詢問是否覆蓋
  • -f 不詢問是否覆蓋
復(fù)制文件或目錄

cp [options] src destcp [options] src... dir

參數(shù)說明

  • -f 覆蓋已經(jīng)存在的目標(biāo)文件而不給出提示
  • -i-f 相反,給出提示,要求用戶回答 yn
  • -r 若給出的源文件是一個目錄文件,此時將復(fù)制該目錄下所有的子目錄和文件
  • -p 除內(nèi)容外,還把修改時間和訪問權(quán)限也復(fù)制到新文件中
刪除文件或目錄

rm [options] name

參數(shù)說明

  • -i 刪除前逐一詢問確認
  • -f 直接刪除,無需確認
  • -r 刪除目錄及子目錄所有文件
請求

curl [options...] <url>

參數(shù)說明

  • -o / --output FILE 寫入文件而不是輸出到終端
  • -x / --proxy [PROTOCOL://]HOST[:PORT] 使用代理
  • -k / --insecure 允許請求SSL網(wǎng)站而不校驗證書
  • -b / --cookie STRING/FILE 從字符串或文件中讀取cookie
  • -D / --dump-header FILE 將接收到的header寫入文件
  • -A / --user-agent STRING 發(fā)送User-Agent字符串到服務(wù)器
  • -e / --referer 偽造referer
  • -d / --data DATA post請求數(shù)據(jù)
  • -F / --form CONTENT post請求提交表單,文件上傳
curl -x "https.proxy=xxxxx:8080" -o main.html localhost/main.html
編輯文件

sed [-hnV] [-e<script>] [-f<script file>] [FILE]

參數(shù)說明

  • -e<script> / --expression=<script> 以選項中指定的script來處理輸入的文本文件
  • -f<script file> / --file=<script file> 以選項中指定的script文件來處理輸入的文本文件
  • -h / --help 顯示幫助
  • -n / --quiet / --silent 僅顯示script處理后的結(jié)果
  • -V / --version 顯示版本信息

動作說明

  • a 新增,a 的后面可以接字符串,而這些字符串會在當(dāng)前行的下一行出現(xiàn)
  • c 取代,c 的后面可以接字符串,這些字符串可以取代n1,n2之間的行
  • d 刪除
  • i 插入,i 的后面可以接字符串,而這些字符串會在當(dāng)前行的上一行出現(xiàn)
  • p 打印,將某個選擇的數(shù)據(jù)打印出來;通常 p 會與參數(shù) sed -n 一起運行
  • s 取代

替換標(biāo)記

  • g 表示行內(nèi)全面替換
  • p 表示打印行
  • w 表示把行寫入一個文件
  • x 表示互換模版塊中的文本和緩沖區(qū)的文本
  • y 表示把一個字符翻譯為另外的字符,但是不用于正則表達式
  • \1 子串匹配標(biāo)記
  • & 已匹配字符串標(biāo)記

元字符集

  • ^ 匹配行開始,如 /^test/ 匹配所有以 test 開頭的行
  • $ 匹配行結(jié)束,如 /test$/ 匹配所有以 test 結(jié)尾的行
  • . 匹配一個非換行符的任意字符,如 /a.b/ 匹配 a 后接一個任意字符,最后是 b 的字符串
  • * 匹配0個或多個字符,如 /*test/ 匹配所有模版是一個或多個空格后緊跟 test 的行
  • [] 匹配一個指定范圍內(nèi)的字符,如 /[tT]est/ 匹配 testTest
  • [^] 匹配一個不在指定范圍內(nèi)的字符,如 /[^A-SU-Z]est/ 匹配不包含 A-SU-Z 的一個字母開頭,緊跟 est 的行
  • \(...\) 匹配子串,保存匹配的字符,如 s/\(love\)able/\1rs ,loveable 被替換成 lovers
  • & 保存搜索字符,用來替換其他字符,如 s/love/**&**/love 被替換成 **love**
  • \< 匹配單詞的開始,如 /\<love/ 匹配包含以 love 開頭的單詞的行
  • \> 匹配單詞的結(jié)束,如 /love\>/ 匹配包含以 love 結(jié)尾的單詞的行
  • x\{m\} 重復(fù)字符 x ,m 次,如 /0\{5\}/ 匹配包含 50 的行
  • x\{m,\} 重復(fù)字符 x ,至少 m 次,如 /0\{5,\}/ 匹配至少包含 50 的行
  • x\{m,n\} 重復(fù)字符 x ,至少 m 次,不多于 n 次,如 /0\{5,10\}/ 匹配 5-100 的行
  • \w\+ 匹配每一個單詞,如 s/\w\+/[&]/g 為每個單詞加上 []
sed -n '/\(versionCode\)/p'
sed -i "" "s/\">.*</\">${APP_NAME}</" ${FILE}
剪切字符串

如果指定 file 參數(shù),則從文件的每一行剪切字節(jié)、字符和字段并將其寫至標(biāo)準(zhǔn)輸出

如果不指定 file 參數(shù),則讀取標(biāo)準(zhǔn)輸入

必須指定 -b -c -f 之一

cut [-bn] [file]

cut [-c] [file]

cut [-df] [file]

參數(shù)說明

  • -b 以字節(jié)為單位進行分隔
  • -n 取消分隔多字節(jié)字符,僅和 -b 標(biāo)志一起使用
  • -c 以字符為單位進行分隔
  • -d 自定義分隔符,默認為制表符
  • -f-d 一起使用,指定顯示哪個區(qū)域
echo 'username=Jack' | cut -d "=" -f2
截取字符串
  • ${var#} 從左邊開始,刪除第一個匹配到的字符串的左邊字符,保留右邊字符
  • ${var##} 從左邊開始,刪除最后一個匹配到的字符串的左邊字符,保留右邊字符
  • ${var%} 從右邊開始,刪除第一個匹配到的字符串的右邊字符,保留左邊字符
  • ${var%%} 從右邊開始,刪除最后一個匹配到的字符串的右邊字符,保留左邊字符
var="name=Jack"
echo ${var#*=}

例子

打印log到控制臺并追加到文件
echo -e "gradle clean \n" | tee -a ${result}
判斷參數(shù)個數(shù)
# 當(dāng)參數(shù)個數(shù)不等于2時,輸出 用法 到控制臺
if [[ $# != 2 ]]
then
    echo "Usage: $0 [src] [dest]"
fi
文件夾操作
# 當(dāng)文件夾不存在時,創(chuàng)建文件夾; 當(dāng)文件夾存在時,清空文件夾
if [[ ! -d ${folder} ]]
then
    mkdir ${folder}
else
    rm -rf ${folder}/*
fi
文件操作
# 當(dāng)文件不為空時,拷貝文件
if [[ -s ${file} ]]
then
    cp -f ${file} ${dest}
fi
定義函數(shù)
  • download.sh
download() {
    fileName=${1##*/}
    curl -o ${fileName} $1
    echo "${fileName}"
}
引入配置文件
  • sh.config
MAIN_MODULE=app
APP_NAME=JL
OUTPUT=outputs
  • test.sh
source ./sh.config
echo "main module is ${MAIN_MODULE}"
執(zhí)行函數(shù)并將結(jié)果賦值
source ./download.sh
file=$(download ${url})
echo ${file}
使用 sed 匹配截取字符串

配置文件 config.xml 如下

<resources>
    <string name="app_name">Demo</string>
</resources>

獲取 app_name 的值,即 Demo

sed -n "/app_name/p" config.xml | sed "s/.*\"app_name\">\(.*\)<.*/\1/"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,727評論 0 5
  • 第1章 小試牛刀 $ 是普通用戶,# 表示管理員用戶 root。 shebang:#!。sharp / hash ...
    巴喬書摘閱讀 6,684評論 1 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • 菜鳥教程shell在線編輯器大目錄整理: 1.第一個 Shell 腳本嘗試 2.Shell 變量 3.Shell ...
    中酷男閱讀 6,047評論 0 12
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,542評論 1 19

友情鏈接更多精彩內(nèi)容