shell 變數,字串,陣列,注釋,引數傳遞

2022-07-26 16:30:18 字數 4079 閱讀 3264

linux的shell有很多種,常見的有bourne shellbourne again shellc shellk shellshell for root

等,其中bourne again shell,由於易用和免費,bash在日常工作中被廣泛使用,本系列文章就是基於b shell進行**的

之前所講的的linux命令,例如ls,cat,mkdir等等,都可以在shell裡面得到執行

這裡補充幾個之前沒提到但又比較有用的命令

#!/bin/bash

echo

"hello shell"

以上就是乙個簡單的shell指令碼示例

新建檔案,按約定一般shell指令碼字尾名為sh,這並不是一定的,因為linux對於檔案的識別並不是通過字尾名

字尾名對於linux並沒有作用,這樣寫是為了方便,算是一種行業規定,並非一定

文字開頭的#!是乙個約定的標記,用來告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種shell

echo 命令用於向視窗輸出文字

shell可以直接執行,也可以作為輸入源來執行

直接執行的話,需要將sh指令碼賦予執行許可權

作為輸入源,需要使用/usr/sh來執行

前一種方式比較常見

變數說明

在shell中,變數名和其他程式語言類似,變數名遵循字母數字下劃線,數字不能開頭

變數不需要指定型別,定義即可

key=

"test"

這裡有一點值得注意,在其他程式語言中,往往為了美觀,會在賦值號左右加上空格,而在shell中這樣的做法是不可以的

變數賦值

在shell中,變數的賦值有兩種方式

顯示的賦值,例如

key=

"test"

語句賦值,shell可以使用其他語句的結果為變數賦值

for

filein`

ls /etc`

變數使用

使用乙個變數,在變數名前面新增$符號,表示要獲取這個變數的值

key="test"

echo $key

當變數與其他混合在一起,可以使用{}定義變數的邊界

key_1="test1"

key_2="test"

echo $

此處如果不對邊界加以區分,那麼編譯器將$以後當作變數,其輸出的結果就不是預期值了

變數的一些細節

定義過的變數可以重新賦值

這也很好理解,在一般程式語言裡面,變數的定義需要型別,再次賦值則不需要,而在shell裡面是沒有這種規定的,那麼定義乙個變數以後,要修改這個變數的值,那麼只能和定義看上去一樣了,從這個角度來說,有些資料說變數可以重定義,我認為說法是不準確的,這裡準確來說應該是賦值

key=

"test1"

echo

$key

key=

"test2"

echo

$key

唯讀變數與刪除變數

變數可以為唯讀,只需在前面加上readonly即可,唯讀變數的值一旦被定義,那麼就不能修改

key=

"test"

readonly key

變數可以被刪除,使用unset刪除乙個變數

刪除的變數不能再被使用

key=

"test"

unset key

注意:unset不可以刪除唯讀變數

字串可以用單引號,也可以用雙引號,也可以不用引號

單引號單引號類的字元會保持原樣,怎麼寫的就怎麼用

例如存在變數key,在單引號中存在$key,那麼他就是乙個$key,與key變數沒有任何關係

string=

'string test'

反引號一般也用於命令的執行,其等價於$()

雙引號雙引號與單引號最大的區別在於單引號不可以有變數,而雙引號可以,同時還可以存在轉義字元

string=

"string test"

單雙引號都可以對字串進行拼接

key=

" key "

str1=

"test"

$key

"ok"

str2=

"test$ok"

str3=

'test'

$key

'ok'

字串操作
string="test"

echo $

string=

"test"

echo

$

string=

"test"

echo

`expr index "$string" es`

bash只支援一維陣列(不支援多維陣列),沒有限定陣列的大小

和其他語言一樣,其可以通過下標來得到陣列值,下標從0開始

定義陣列

陣列名=(值1 值2 ... 值n)

陣列值之間通過空格隔開

testarr=

(1 2 3 4)

其下標可以不連續,沒有範圍限制

$

和一般變數使用類似

key=

$

可以使用*@來獲取陣列中的所用元素

echo

$echo

$

獲取陣列的長度

陣列長度

len=$

len=$

元素長度

len=$
單行注釋

shell通過#進行注釋

#這是乙個注釋

#這也是乙個注釋

多行注釋

shell中的多行注釋,使用:<<開始,其後面新增乙個標誌,然後在注釋完成的地方再加乙個同樣的標誌

:<<

eoftest

test

test

eof

shell指令碼在執行的時候可以對其傳遞引數

可以使用$n對其傳遞的引數接收

例如執行test.sh 1 2 3,在test.sh內可以使用$0代表程式本身,$1代表第乙個引數

這和c語言main函式的引數接收是一樣的

引數處理

說明$#

傳遞到指令碼的引數個數

$*

以乙個單字串顯示所有向指令碼傳遞的引數

$$

指令碼執行的當前程序id號

$!

後台執行的最後乙個程序的id號

$@

$*相同,但是使用時加引號,並在引號中返回每個引數

$-

顯示shell使用的當前選項,與set命令功能相同

$?

顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤

Shell注釋 字串 陣列

shell注釋 sh裡沒有多行注釋,只能每一行加乙個 號。如果遇到大段的 需要注釋,可以把這一段用花括號擴起來,定義成乙個函式,沒地方呼叫這個函式,這塊 就不會執行。shell字串 字串可以用單引號,也可以用雙引號,還可以不用。單引號 單引號裡的任何字元都會原樣輸出,變數是無效的 單引號字串中不能出...

字串變數陣列

定義乙個字串位址的陣列,通過陣列統一處理字串,便於使用完字串之後,統一賦值null 2,賦值以及讀取 for i 0 i 2 i printf s s s n d 0 d 1 d 2 如下 1 include2 include3 char a zhang 4 char b yong 5 char c...

Shell學習之路 03 變數 字串 陣列

1.變數 1.1 常規變數 變數名的命名須遵循如下規則 定義變數時,變數名不加美元符號 如 variablename value 使用乙個定義過的變數,只要在變數名前面加美元符號 即可,可加可不加,如 your name mozhiyan echo your name echo 已定義的變數,可以被...