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...