最近發現shell指令碼在平常工作中簡直算一把瑞士軍刀,很多場景下用shell指令碼能實現常用的簡單需求,而之前都沒怎麼學習過shell,就趁機把shell相關的語法和常見用法總結了下,方便以後隨時回顧和查閱!
其實shell的開始並不難,第一行如下:
#!/bin/bash
叫做shebang
shell的注釋以#
開頭(這點類似於python)
變數定義:
var_test1="hello"
注意定義和賦值時=
兩邊均不能有空格,且變數名前不能加$
!
變數使用:
echo $var_test1
或echo $
或:str1="$ world"
加上美元符後的變數會被替換為其值。注意,單引號中的不會被替換
命令執行結果賦給乙個變數:
lines=`wc -l 1.txt` # 這裡lines就被賦值為了1.txt的行數
lines="$(wc -l 1.txt)" # 單撇號不能巢狀,可用這種包含在內
格式化變數:
echo 23 | awk # 00023
字串擷取:
$
會得到"ell"
,即從索引1開始取3個字元
shell中的輸出直接用echo即可
echo "hello word"
等同於echo hello word
echo "what's your name?"
read name # 這裡不需要宣告新變數
echo hello, $name!
echo "always executed" || echo "only executed if first command fails"
echo "always executed" && echo "only executed if first command does not fail"
echo "always executed1" ; echo "always executed2"
最簡單的判斷邏輯是:
if [ condition1 ]; then
statement1
elif [ condition2 ]; then
statement2
else
statement3
fi# 或者用test
if test condition1 ; then
statement1
fi
注意:condition兩邊與之間必須至少有乙個空格
shell中判斷條件不同於其他語言中的<,>,==,<=,>=那麼直接,常見的有下列幾種:
-eq 等於(==)
-ne 不等於(!=)
-gt 大於(\>)
-lt 小於(\<)
-le 小於等於
-ge 大於等於
-z 空串
-n 非空串
== 兩個字元相等
!= 兩個字元不等
-a 且
-o 或
-f 判斷後面是否為乙個檔案
-d 判斷後面是否為乙個目錄
-e 判斷後面對應的檔案是否存在
-s 判斷檔案是否存在且不為空
case "$variable" in
# 列出需要匹配的字串
0) echo "there is a zero.";;
1) echo "there is a one.";;
*) echo "it is not null.";;
esac
# == `seq 1 3`
for variable in
do echo "$variable"
done
或傳統的"for迴圈",但需要加兩層括號(兩層的小括號內可以寫c語言中的語句):
for ((a=1; a <= 3; a++))
do echo $a
done
在其他命令的結果上執行for迴圈:
for output in $(ls)
do cat "$output"
done
while [ condition ]
do echo "loop body here..."
break
done
$# 命令列引數個數
$0 當前指令碼名
$n 第n個引數值,n可取1,2,3...
$@ 所有命令列引數
$? 上乙個命令的返回值
# 列印每行中 ',' 之前內容
cut -d ',' -f 1 file.txt
# 將 file.txt 檔案所有 'okay' 替換為 'great', (相容正規表示式)
sed -i 's/okay/great/g' file.txt
# shell中不支援浮點數除法運算,可使用awk實現浮點除法
a=3b=4
c=`awk 'begin'` # 單引號內的變數不能被替換,因此需要將變數單獨放在引號外
sort
-k 指定比較的列(從1開始)
-n 數值比較
-r 倒序
-o filename 輸出到檔案(可用此選項輸出到輸入檔案)
-f 不區分大小寫排序
-c 檢查是否已排序好,如果未排序好則輸出第乙個未按序的行
-m 按月份排序
-b 忽略前導空格
-u 得到不重複的行
多列排序:sort -k1,1 -k3nr,3
命令
作用$
$string
的長度
$
在$string
中, 從位置$position
開始提取子串
$
在$string
中, 從位置$position
開始提取長度為$length
的子串
$
從變數$string
的開頭, 刪除最短匹配$substring
的子串
$
從變數$string
的開頭, 刪除最長匹配$substring
的子串
$
從變數$string
的結尾, 刪除最短匹配$substring
的子串
$
從變數$string
的結尾, 刪除最長匹配$substring
的子串
$
使用$replacement
, 來代替第乙個匹配的$substring
$
使用$replacement
, 代替所有匹配的$substring
$
如果$string
的字首匹配$substring
, 那麼就用$replacement
來代替匹配到的$substring
$
如果$string
的字尾匹配$substring
, 那麼就用$replacement
來代替匹配到的$substring
a="one,two,three,four"
# 要將$a分割開,可以這樣:
old_ifs="$ifs"
ifs=","
arr=($a)
ifs="$old_ifs"
for s in $
do echo "$s"
done
# 後面的可以直接改為只取$
enum用法小記
enum是大家都比較喜歡用的一種結構,有助提供清晰的邏輯,有點技巧能使其更有用。以前經常看到這樣的 不知其最後的none也何用,今天實際碰到時,才知道是多麼美妙的技巧啊。一般的,用int i b 這樣的寫法,肯定是沒問題的,顯然,在這裡 i 等於1,但是,如果我要將int轉換為enum值,典型的情況...
linux expect 用法小記
使用expect實現自動登入的指令碼,網上有很多,可是都沒有乙個明白的說明,初學者一般都是照抄 收藏。可是為什麼要這麼寫卻不知其然。本文用乙個最短的例子說明指令碼的原理。指令碼 如下 usr bin expect set timeout 30 spawn ssh l username 192.168...
Vector用法小記
vector sprite sp vec sp vec.pushback sp 和 堆疊 一樣一樣的 int count int sp vec.size 這裡不是一定要強轉型別,各人習慣,因為看不慣x code總是報警告 for auto e sp vec 如果是要刪除容器中最後乙個物件的話 sp ...