Shell常見用法小記

2022-02-15 16:33:36 字數 4529 閱讀 4370

最近發現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 ...