shell學習筆記

2021-07-10 06:53:26 字數 3800 閱讀 1628

shell指令碼在linux下開發經常需要用到,shell的指令碼可以幫助使用者自動化地和作業系統進行互動,起到了提高效率的作用。

學習一門語言,通常需要實戰演練編碼除錯,shell該如何除錯呢?使用bash -x命令即可。

vi demo.sh敲入**:

#!/bin/bash

echo

1;echo $(date +'%y-%m-%d');

執行bash -x demo.sh將輸出

+ echo 1

#**1

#執行結果

++ date +%y-%m-%d #巢狀**

+ echo 2014-10-30

#**2014-10-30

#執行結果

可以看到,bash會先輸出**,再輸出執行結果,前面帶+號表示這是一行shell**,多個+號表示**有巢狀邏輯。

更多除錯方法見

如何從命令外部傳遞引數到指令碼裡頭?

#!/bin/bash

echo

$0#指令碼名

echo

$1#第乙個引數

echo

$#第2個引數

echo

$##引數總數(不含$0)

echo $* #所有引數(不含$0)

執行bash demo.sh aa bbb ccc dddd將輸出:

demo.sh

aabbb4aa

bbb ccc dddd

$*$@的區別?

$*$@都表示傳遞給函式或指令碼的所有引數,不被雙引號("")包含時,都以」$1」 「$2」 … 「$n」 的形式輸出所有引數。

但是當它們被雙引號("")包含時,

"$*"會將所有的引數作為乙個整體,以"$1 $2 … $n"的形式輸出所有引數;

"$@"會將各個引數分開,以"$1""$2""$n"的形式輸出所有引數。

變數的命名語法是:

賦值時等號兩邊不能帶空格,否則會報錯。

#字串變數賦值

name=wang age="100"

#陣列變數賦值(3種方式)

array_name1=(value1000 value11 value12 value13)

array_name2=(

value20

value21

value22

value23

)array_name3[0]=value30

array_name3[1]=value31

array_name3[2]=value32

#雙引號內使用變數,單引號不識別內部變數。

echo

"雙引號:$name is $ years old."

echo

'單引號:$name is $ years old.'

#不使用雙引號

echo 不使用雙引號:$ is $age years old.

#讀取陣列元素

echo

"陣列元素:$

$$";

#使用@ 或 * 可以獲取陣列中的所有元素,例如:

echo

"陣列@:$"

echo

"陣列*:$"

#取得陣列元素的個數

echo

"陣列元素的個數:$

$"#取得陣列單個元素的長度

echo

"陣列單個元素的長度:$"

將輸出

雙引號:wang is 100 years old.

單引號:

$name is $ years old.

不使用雙引號:wang is 100 years old.

陣列元素:value12 value22 value32

陣列@:value1000 value11 value12 value13

陣列*:value1000 value11 value12 value13

陣列元素的個數:43

陣列單個元素的長度:

9

使用變數可以是$name或者$的形式,注意有別於php字串內變數$表示可變變數,類似於php的$$name

自定義變數往往需要參與各種字串拼接,如果不加括號,既不利於閱讀,也很容易導致邏輯錯誤。

# good

prefix="pre"

echo

"$_dir/file"

# bad

# 會把prefix_dir視為變數名,由於無定義,會輸出/file,若設定了set -u,則會報錯。

prefix="pre"

echo

"$prefix_dir/file"

語法特點為:

if [[ 0

-eq2 ]]

then

echo

'if'

elif [ 2 ]; then

echo

'else if'

else

echo

'else'

fi

字串

檔案狀態

邏輯操作

例如

[ 1 -lt 2 ]

echo $?

#true

[ "a" != "a" -o "b" = "c" ]

echo $?

#false

[ "a" != "a" ] || [ "b" = "c" ]

echo $?

#false

#從標準輸出獲取陣列

list1=$(echo

'aaa bbb ccc ddd' | awk '')

for i in

$#初始化陣列

list2=(123

4)for i in$do

echo

$idone

#構建迴圈條件列表

for i in

$ "}

}

function

foo()

return

22; #返回值

}foo 123 abc

echo $?

將輸出

123

abc22

echo $(pwd)  #語法可讀性更好,且支援巢狀

echo `pwd`

使用$(()), 不使用let

# i自增1

$(( i += 1 ))

# 複雜的算數計算

min=5

sec=30

echo $(( (min * 60) + sec ))

shell 學習筆記

shell 是解釋型語言 移植性強課對應不同的直譯器 bin sh f 變數開頭以乙個字母或者下劃線,後接任意長度的字母 數字或者下劃線。命令 commod op 引數 輸入 輸出 重定向管道 echo printf 大口如小口出。特殊檔案 dev null bit bucket 刪除所有輸入的資料...

shell學習筆記

1 shell檔案的第一行都必須是 bin sh 也可以有其他路徑,這裡我們只以這個為例 2 定義變數 a value 中間不能有空格 呼叫方法 echo a 3 shell常用的條件測試 備註 方括號兩側必須要有空格,f lt等兩側也必須要有空格 a f file 判斷 file是否是乙個檔案 b...

Shell學習筆記

0 序言 由於linux圖形化介面 x視窗系統 不是linux自帶程式 相當耗費系統資源,會極大降低linux系統的效能。因此推薦使用shell工具。shell是個命令語言直譯器,在linux的命令列介面下使用。使用者在提示符下輸入的命令都有shell先解釋然後再傳給linux核心。一 shell呼...