Shell指令碼快速入門 1

2021-10-02 17:09:56 字數 3667 閱讀 3355

shell 是乙個用 c 語言編寫的程式,使用者可以通過shell指令碼語言來進行程式開發。與其他指令碼語言不同,shell指令碼所需的直譯器一般是內建在作業系統的,而像node.js、php等指令碼語言需要手動安裝直譯器程式才可以。

接下來將和大家一起來學習shell指令碼程式設計。

shell直譯器種類眾多,筆者的電腦上內建以下shell:

/bin/bash

/bin/csh

/bin/ksh

/bin/sh

/bin/tcsh

/bin/zsh

其中bash和sh是最常見的shell直譯器,一般情況下,這兩種shell沒有區別,本文以bash為例。

開啟文字編輯器(vim或者vscode),新建檔案hello.sh,擴充套件名為sh(常用)。

#!/bin/bash

echo "hello world!"

第1行用來指明本指令碼需要使用什麼直譯器來執行。#!是乙個約定的語法。

echo用來輸出文字。

有兩種方法可以執行shell指令碼:

作為可執行程式。給指令碼新增可執行許可權之後執行即可。

chmod  x ./hello.sh # 新增可執行許可權

./hello.sh # 執行指令碼

作為直譯器指令碼。直接執行指定的直譯器程式,並將指令碼路徑傳入,本方式不要求指令碼有可執行許可權。

/bin/bash hello.sh # 使用/bin/bash來執行hello.sh
和其他程式語言一樣,shell指令碼也有自己的一套語法規則,我們現在來系統學習一下。

命名規則

定義變數時,變數名不加美元符號$,如:

name="xialei"
和其他程式語言不同的時,shell指令碼中變數名和等號之間不能有空格。shell變數名的命名規則如下:

以下是合法的示例

var1

var_2

_var3

max_page

以下是不合法的示例

$var
賦值shell有以下兩種複製方式。

直接賦值。直接在等號後面指定變數值。

name="xialei

admin=1

使用命名執行結果。可以將其他命令的執行結果賦值給變數。(以下兩種方式是等效的)

file=`ls /etc` # 反引號(鍵盤tab上面的鍵)

file1=$(ls /etc)

已經存在的變數,可以被重新賦值。

name="hello"

echo $name

name="world"

echo $name

使用變數

使用變數時在變數名前新增$符號,定義時不加。

name="xialei"

echo $name

echo $

變數名兩邊的花括號是可選的,一般情況下不用加,但是如果涉及到邊界識別問題,則需要手動新增花括號。

name="xialei"

echo "i'm $studio." # 正確示例

echo "i'm $namestudio." # 錯誤示例

如果不新增花括號,shell會將namestudio作為變數,該變數是不存在的,因此**執行邏輯就不是我們想要的了。

唯讀變數

如果某些變數在定義後就無法更改該變數的值,可以設定使用readonly設定為唯讀變數,對唯讀變數賦值會跑出錯誤。

name="xialei"

readonly name

name="zhangsan"

上述例子執行結果如下

./hello.sh: line 5: name: readonly variable
釋放變數

使用unset可以釋放變數。變數被釋放後不能使用(使用不會報錯,shell中使用未定義變數當做空值處理),此外unset命令無法釋放唯讀變數。

name="xialei"

unset name # 不要$

echo $name

變數型別

shell指令碼執行時,存在以下三種變數:

shell支援數字、字串和陣列三種資料型別。下面我們分別進行學習。

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

單引號

name='xialei'
雙引號

name='xialei'

msg="hello, $"

echo $msg

字串拼接

字串拼接有以下兩種方式。

引號拼接(支援雙引號和單引號)

name='xialei'

msg='hello '$name', welcome!'

echo $msg

內部巢狀(只支援雙引號,因為單引號不解析變數)

name='xialei'

msg="hello $, welcome!"

echo $msg

陣列shell只支援一維陣列,不限定陣列大小。

陣列的索引由0開始,讀取元素的索引可以使用整數或表示式。

陣列定義

陣列元素使用小括號括起來,每個元素之間用空格分割。

users=(xialei zhangsan lisi)
讀取陣列元素

語法如下:

$
比如上例中讀取第2個人

users=(xialei zhangsan lisi)

echo $ # 輸出zhangsan

使用@作為下標可以獲取陣列的所有元素。

users=(xialei zhangsan lisi)

echo $ # 輸出 xialei zhangsan lisi

獲取陣列長度

語法如下

length=$
比如輸出users陣列的長度

(未完待續)

shell指令碼學習(1)入門

1指令碼語言和編譯型語言的區別 編譯型的要從原始碼轉換成目標 多執行於底層。指令碼語言有直譯器讀入程式 轉成內部形式再執行。2指令碼語言,寫的時間快,一般有awk,pwel,python ruby和shell 3 使用who 和 wc算登入人數 4 用cat建立檔案,寫入程式,修改許可權,執行程式 ...

shell指令碼快速入門之 陣列

四 陣列的操作 五 陣列指令碼例項 什麼是陣列?陣列是存放相同型別資料的集合,在記憶體中開闢了連續的空間,通常配合迴圈使用 普通陣列 不需要宣告直接定義,下標索引只能是整數 關聯陣列 需要用declare a宣告否則系統不識別,索引可以是字串 如 arr 11 22 33 44 陣列名稱 arr 陣...

Shell指令碼(三) Shell指令碼入門

1 指令碼格式 指令碼以 bin bash開頭 指定解析器 2 第乙個shell指令碼 helloworld 1 需求 建立乙個shell指令碼,輸出helloworld 2 案例實操 atguigu hadoop101 datas touch helloworld.sh atguigu hadoo...