Shell腳本快速入門(1)

Shell 是一個用 C 語言編寫的程序,用戶能夠經過Shell腳本語言來進行程序開發。與其餘腳本語言不一樣,Shell腳本所需的解釋器通常是內置在操做系統的,而像Node.js、PHP等腳本語言須要手動安裝解釋器程序才能夠。shell

接下來將和你們一塊兒來學習Shell腳本編程。編程

Shell解釋器

Shell解釋器種類衆多,筆者的電腦上內置如下Shell:vim

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh複製代碼

其中bash和sh是最多見的Shell解釋器,通常狀況下,這兩種Shell沒有區別,本文以bash爲例。數組

Hello World

打開文本編輯器(vim或者vscode),新建文件 hello.sh,擴展名爲sh(經常使用)。bash

#!/bin/bash
echo "Hello World!"複製代碼

第1行用來指明本腳本須要使用什麼解釋器來執行。#!是一個約定的語法。編程語言

echo用來輸出文本。編輯器

執行Shell腳本

有兩種方法能夠執行Shell腳本:學習

  1. 做爲可執行程序。給腳本添加可執行權限以後執行便可。
chmod +x ./hello.sh # 添加可執行權限
   ./hello.sh # 執行腳本複製代碼


  1. 做爲解釋器腳本。直接運行指定的解釋器程序,並將腳本路徑傳入,本方式不要求腳本有可執行權限。
/bin/bash hello.sh # 使用/bin/bash來執行hello.sh複製代碼

Shell語法

和其餘編程語言同樣,Shell腳本也有本身的一套語法規則,咱們如今來系統學習一下。spa

變量

命名規則

定義變量時,變量名不加美圓符號$,如:操作系統

name="xialei"複製代碼

和其餘編程語言不一樣的時,Shell腳本中變量名和等號之間不能有空格。Shell變量名的命名規則以下:

  • 只能包含英文字母、數字和下劃線,且不能以數字開頭
  • 不能包含空格
  • 不能使用關鍵字命名(經過下劃線鏈接關鍵字是容許的)
  • 不能使用標點符號

如下是合法的示例

var1
var_2
_var3
MAX_PAGE複製代碼

如下是不合法的示例

$var複製代碼

賦值

Shell有如下兩種複製方式。

  1. 直接賦值。直接在等號後面指定變量值。
name="xialei
   admin=1複製代碼


  1. 使用命名執行結果。能夠將其餘命令的執行結果賦值給變量。(如下兩種方式是等效的)
file=`ls /etc` # 反引號(鍵盤Tab上面的鍵)
   file1=$(ls /etc)複製代碼

已經存在的變量,能夠被從新賦值。

name="hello"
echo $name

name="world"
echo $name複製代碼

使用變量

使用變量時在變量名前添加$符號,定義時不加。

name="xialei"
echo $name
echo ${name}複製代碼

變量名兩邊的花括號是可選的,通常狀況下不用加,可是若是涉及到邊界識別問題,則須要手動添加花括號。

name="xialei"
echo "I'm ${name}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腳本也能夠在運行時定義環境變量
  • Shell變量。Shell變量是由Shell解釋器設置的變量。Shell變量中有一部分是局部變量,有一部分是環境變量。

數據類型

Shell支持數字、字符串和數組三種數據類型。下面咱們分別進行學習。

字符串

字符串可使用單引號、雙引號,也能夠不使用引號。

單引號

name='xialei'複製代碼

  • 單引號內的任何字符都會原樣使用,不解析變量,也不解析轉義字符。這一點和PHP有點相似

雙引號

name='xialei'
msg="Hello, ${name}"
echo $msg複製代碼

  • 雙引號內的字符串會進行變量解析和轉義字符解析
字符串拼接

字符串拼接有如下兩種方式。

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

name='xialei'
msg='Hello '$name', welcome!'
echo $msg複製代碼

內部嵌套(只支持雙引號,由於單引號不解析變量)

name='xialei'
msg="Hello ${name}, welcome!"
echo $msg複製代碼

數組

Shell只支持一維數組,不限定數組大小。

數組的索引由0開始,讀取元素的索引可使用整數或表達式。

數組定義

數組元素使用小括號括起來,每一個元素之間用空格分割。

users=(xialei zhangsan lisi)複製代碼

讀取數組元素

語法以下:

${數組名稱[下標]}複製代碼

好比上例中讀取第2我的

users=(xialei zhangsan lisi)
echo ${users[1]} # 輸出zhangsan複製代碼

使用@做爲下標能夠獲取數組的全部元素。

users=(xialei zhangsan lisi)
echo ${users[@]} # 輸出 xialei zhangsan lisi複製代碼

獲取數組長度

語法以下

length=${#數組名[@]}複製代碼

好比輸出users數組的長度

users=(xialei zhangsan lisi)
echo ${#users[@]}複製代碼

今天的內容主要是讓你們對Shell有一個宏觀的認識,介紹了Shell的變量以及數據類型,下一篇將重點介紹Shell的運算符和流程控制。

0.jpeg

(未完待續)

相關文章
相關標籤/搜索