sheel script
shell腳本語法規范
如何書寫一個shell腳本
-
檔案沒有擴展名的概念,最好以.sh結尾,最好在30個字符以內
-
#代表注釋,#!是特例,定義腳本在哪個路徑運行
-
腳本的說明欄位
- 運行決議路徑#!/bin/bash
- 作者#Author:guying
- 時間#Created Time
- 版本號#Release:1.0
- 腳本描述#Script Description:nginx install script
- 如何自動生成???
-
腳本組成
- #解釋環境:例如#!/user/bin/env或者bash |python|perl
- #注釋說明
- #執行代碼
-
如何運行一個shell腳本
- 給執行權限 ./檔案名
- 解釋器直接運行,不需要給權限 bash 檔案名
- 解釋環境有很多種,例如bash sh ,用cat /etc/shells查看
-
shell中的特殊符號
- ~ 代表家目錄,# cd ~
- ! 執行歷史命令 !!執行上一條命令
- $ 變數中取內容符
-
-
-
- % 對應數學運算,加減乘除取余數
-
-
- & 后臺執行
-
- shell中的通配符 匹配所有
- ? shell中的通配符 ,匹配除了回車鍵以外的一個字符
- ; 分號可以在shell中一行執行多個命令,命令之間用分號分隔
- | 管道
- \ 轉義字符
反引號 ,命令中執行命令 echo ”today isdate+%F“- ’ ’ 單引號,腳本中字符要用單引號引起來,但是不同于雙引號的是,單引號不解釋變數
- " " 雙引號,腳本中出現的字串可以用雙引號引起來
-
shell在管道中的應用
- 用于拼接命令,通過管道可以執行一些復雜的資料處理操作
shell中的運算
-
算術運算(四則運算)
-
-
-
- % 對應數學運算,加減乘除取余數
-
-
運算命令
-
整形運算
- -expr只能做整數運算
- -let只能做整數運算,而且運算元素必須是變數,無法直接對整數做運算let sum=1+1
- -$(( ))雙小圓括號里也可以做數學運算
- -bc計算器
-
-
浮點運算
- -bc采用命令組合的方式實作,echo “scale=N;數學運算式”|bc,例如echo ”scale=2;100*3“|bc
-
-
-
比較運算
-
整形比較運算
-
精確比較
- -eq等于
- -gt大于
- -lt小于
-
模糊比較
- -ge大于或等于
- -le小于或等于
- -ne不等于
-
-
-
字串比較運算
- =等于回傳true
- ! =不等于回傳ture
- -n 檢查字串的長度是否大于0,不為0回傳true
-
- z 檢查字串的長度是否為0,為0回傳true
- $ 檢測字串是否為空,不為空就回傳true
-
邏輯運算
-
使用場景
- 多條件同時判斷
-
邏輯運算子
- && 真真為假、真偽為假、假假為假
- || 真真為真、真偽為真、假假為假
- ! 非假為真、非真為假
-
邏輯與或的短路運算
- 邏輯與中靠前的條件中出現了假,后面的就不再判斷了,因為已經是假的了
- 邏輯或中靠前的條件中出現了真后面的就不再往后判斷了,結果已經為真了
-
-
檔案判斷(檔案型別、權限、新舊判斷)
-
test判斷命令
-
檢測檔案型別和比較運算
-
teat [命令選項] 運算式
-
命令選項
- -d 檢查檔案是否存在且為目錄,若存在且為目錄則為真
- -e 檢查檔案是否存在,存在則為真
- -f 檢查檔案是否存在且為檔案,若存在且為檔案則為真
- -r 檢查檔案是否存在且可讀
- -s 檢查檔案是否存在且不為空, 如果檔案存在且至少有一個字符則為真
- -w 檢查檔案是否存在且可寫,可寫則為真
- -x 檢查檔案是否存在且可執行,可執行則為真
- -O 檢查檔案是否存在且被當前用戶擁有
- -G 檢查檔案是否存在且默認組為當前用戶組
- -nt file1 -nt file2檢查file1是否比file2新
- -nt file1 -ot file2檢查file1是否比file2舊
- -ef file1 -ef file2檢查file1和file2是否為同一個檔案,判斷依據的是i節點
- -b 檢查檔案是否為塊設備檔案,若檔案存在且為塊檔案則為真
- -c 檢查檔案是否為字符設備檔案,如果檔案存在且為字符特殊檔案則為真
- -g 檢測檔案是否設定了SGID位
- -k 檢測檔案是否設定了
-
-
-
-
布爾運算子
-
!
- 非
-
-o
- 或
-
-a
- 與
-
腳本的運行和退出
- 運行
- bash 檔案名
- 退出
- exit NUM推出腳本,釋放系統資源,NUM代表一個整數,代表回傳值,
為腳本設定可執行權限,并執行腳本
-
$ chmod +x test.sh
-
$ ./test.sh 1 2 3
- 輸出第1、2、3個引數
格式化輸出
echo命令
-
在顯示幕上顯示一段文字
-
echo [-ne] [字串]
-
命令選項
- -n 不要在最后自動換行
- -e 若字串中出現以下的字符,則特別加以處理,而不會將它當成一般文字輸出,
-
轉義字符
- \b 洗掉前一個字符
- \c 最后不加上換行符號
- \n 換行且游標移至行首
- \t 插入tab符號
- \f 換行但是游標仍舊停留在原來的位置
shell的基本輸入、輸出
read命令 讀取
-
命令選項
- -p列印資訊
- -t限定時間
- -s不回顯
- -n 輸入字符個數
echo命令
-
顯示普通字串的時候,雙引號可以省略
-
顯示轉義字符
-
echo “”\我是古穎"" 結果為"我是古穎"
- 雙引號也可以省略
-
-
顯示變數
- read name
- echo “$name It is a test”
-
顯示換行
- echo -e “OK! \n” # -e 開啟轉義
-
顯示不換行
- echo -e “OK! \c” # -e 開啟轉義 \c 不換行
-
顯示結果定向至檔案
- echo “It is a test” > myfile
-
原樣輸出字串,不進行轉義或取變數(用單引號)
- echo ‘$name"’
-
顯示命令執行結果
- echo
date這里是單引號
- echo
printf命令
-
語法:printf format-string [arguments…]
- format-string: 為格式控制字串
- arguments: 為引數串列
-
格式替代符
-
%s
- 輸出一個字串
-
%c
- 輸出一個字符
-
%d
- 整形輸出
-
%f
- 輸出實數
-
%-10s
- 指一個寬度為 10 個字符(- 表示左對齊,沒有則表示右對齊),任何字符都會被顯示在 10 個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來,
-
%-4.2f
- 指格式化為小數,其中 .2 指保留2位小數,
-
-
printf的轉義序列
shell字串
單引號
- 單引號里的任何字符都會原樣輸出,單引號中的變數是無效的
- 單引號內的字串中不能出現單獨一個的單引號,可成對出現,對單引號使用轉義字符后也不行
雙引號
- 雙引號中可以有變數
- 雙引號中可以出現轉義字符
拼接字串
- 使用雙引號拼接!!!
string=“guying is so beautiful”
-
獲取字串長度
- echo $(#string) 輸出為4
-
提取子字串
-
從字串第二個字符開始截取4個字符
- echo ${string:1:4} 輸出為 uyin
-
-
查找子字串
-
查找字符i或g的位置(哪個字母先出現,就計算哪個)
-
echo
expr index "$string" ig輸出為1- 注意
是反引號
- 注意
-
-
shell陣列
定義陣列
-
用括號表示陣列,陣列元素用空格符號分開
-
array_name=(value0 value 1 value2)
-
或者單獨定義陣列的各個分量:
- array_name[0]=value0
-
讀取資料
-
讀取元素值
-
${陣列名[下標]}
- valuen=${array_name[n]}
-
-
使用@獲取陣列的所有元素
- echo ${array_name[@]}
獲取陣列的長度(與獲取字串的方法相同)
-
獲取陣列元素的個數
- length=$(#array_name[@]}
- 或者length=${#array_name[*]}
-
獲取陣列單個元素的長度
- length=${#array_name[n]}
shell注釋
#開頭就是注釋,除#!
多行注釋
- :<<EOF
- 中間是注釋內容
- EOF
shell傳遞引數
-
? 和 *和 ?和@的區別
-
相同
- 都是參考的所有引數
-
不同
- 只有在雙引號中體現出來,假設在腳本運行時寫了三個引數 1、2、3,,則 " * " 等價于 “1 2 3”(傳遞了一個引數),而 “@” 等價于 “1” “2” “3”(傳遞了三個引數)
-
shell流程控制
if else
-
語法格式
- if then elif then else fi(換行寫)
- if then else fi
- if then fi
for回圈
-
語法格式
- for
- do
- done
while回圈
-
用于不斷執行一系列命令,也用于從輸入檔案中讀取資料
-
語法格式
- while
- do
- done
until回圈
-
執行一系列命令直至條件為 true 時停止,與 while 回圈在處理方式上剛好相反
-
語法格式
- untiil
- do
- done
多選擇陳述句case???esac
- 每個 case 分支用右圓括號開始,用兩個分號 ;; 表示 break,即執行結束,跳出整個 case … esac 陳述句
跳出回圈
-
break命令
- 跳出所有回圈(終止執行后面的所有回圈)
-
continue命令
- 僅僅跳出當前回圈
shell函式
可以帶function fun() 定義,也可以直接fun() 定義,不帶任何引數
函式引數
- $1 為第一個引數
- $2為第二個引數
shell輸入輸出重定向
重定向命令串列
輸出重定向
-
command1 > file1
- 執行command1然后將輸出的內容存入file1,
輸入重定向
-
command1 < file1
- 從鍵盤獲取輸入的命令會轉移到檔案讀取內容
shell檔案包含
. filename # 注意點號(.)和檔案名中間有一空格
或source filename
創建兩個腳本,test1.sh和test2.sh,當test2.sh包含test1.sh,執行test2.sh時,需要給test2.sh添加可執行權限,被包含的test1.sh不需要添加可執行權限
- $ chmod +x test2.sh
- $ ./test2.sh
XMind: ZEN - Trial Version
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258115.html
標籤:其他
上一篇:springboot的CSV匯入clickhouse;批量匯入資料庫
下一篇:Linux檔案系統
