1. 程式人生 > >【Shell】Shell語法總結以及簡易記憶體條的實現

【Shell】Shell語法總結以及簡易記憶體條的實現

基本語法

Shell檔案的開頭

Shell的開頭需要寫成 

#!/bin/bash

#!這個符號是表示,讓系統去呼叫後面的的引數來解釋執行該文字的程式

除此之外,還有下列可以用的直譯器

/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen

Shell進行註釋

# 符號代表的是改行後面的內容註釋

變數

如何定義變數

shell中進行變數的定義時,不需要對變數進行宣告,可以直接賦值

應用變數時,用“ $” + 變數名即可訪問變數的內容

注意:

賦值時,等號左右兩邊不可有空格。因為shell指令碼的內容是由直譯器進行解釋執行的

如果等號進行了空格,便將對變數的賦值視為指令,造成錯誤

特殊變數

$0

相當於C語⾔言main函式的argv[0]

$1、$2...

這些稱為位置引數(Positional Parameter),相當於C語⾔言main函式 的argv[1]、argv[2]...

$#

相當於C語⾔言main函式的argc - 1,注意這⾥裡的#後⾯面不表⽰示註釋

[email protected]

表⽰示引數列表"$1" "$2" ...,例如可以⽤用在for迴圈中的in後⾯面。

$?

上⼀一條命令的Exit Status

$$

當前Shell的程序號

定義陣列

在Shell中,⽤用括號來表⽰示陣列,陣列元素⽤用“空格”符號分割開。 定義陣列的⼀一般形式為: array_name=(value1 ... valuen)
arr=( "hello" "world" "!!!" )

Arr[0]="hello"
Arr[1]="world"
Arr[2]="!!!"

echo ${arr[*]}
echo ${Arr[*]}

流程控制語句

if語句

if [ 10 -gt 20 ] #如果10大於20
	echo "10 > 20" #列印這句話
else 
        echo "10 < 20" 
fi
和C語言不同,if語句的判斷需要加方括號

並且if和 ‘[’ 以及後面的內容都要保持空格分開,原因同上

結尾註意以 fi 結束

&&和||快捷操作符

	echo "Usage $0 data1 ... dataN"
	exit 1
}
&&符號表示的是,如果&&左邊的條件滿足,便執行&&右邊的指令

而不同的是,||表示如果左邊的條件沒有滿足,才執行右邊的指令

()運算子

為了在當前shell中執行一組命令,可以用命令分隔符(即",")隔開每一個命令,並把所有的命令用圓括號()括起來。

case語句

類似於C語言中的Switch,case語句

read n

case $n in 
	1 ) 
		echo "The num is 1"
		;;
	2 )
		echo "The num is 2"
		;;
	*)
		echo "The num is not 1 or 2"
esac

while語句

從1列印到10

i=1
while [ $i -le 10 ]
do	
	echo $i
	let i++
done

for語句

for迴圈和C語言有很大差別

從1列印到10

i=1
for i in {1..10}
do
	echo $i
done

函式的定義

function myfun()
{
	return 0
}
如此,便定義了一個簡單的函式

需要注意的是,函式體不可以為空

函式可以被認為是一個程式或者小指令碼

當該函式被呼叫時,則會產生新的子程序來執行該函式內部的指令

可以用return 來返回子程序結束的退出碼

也可以用echo來返回該函式返回的字串

指令碼的除錯

選項

Shell提供了⼀一些⽤用於除錯指令碼的選項,如下所⽰示:
-n
讀⼀一遍指令碼中的命令但不執⾏行,⽤用於檢查指令碼中的語法錯誤
-v
-x
提供跟蹤執⾏行資訊,將執⾏行的每⼀一條命令和結果依次打印出來

三種除錯方法

命令列提供引數

$ sh -x ./script.sh

指令碼開頭提供引數

#! /bin/sh -x

利用set命令來啟用或者禁用引數

set -x和set +x分別表⽰示l和禁⽤用-x引數,這樣可以只對指令碼中的某⼀一段進⾏行跟蹤除錯。

簡單進度條的實現

#!/bin/bash

i=0
index=0
arr=( '|' '\\' '-' '/')
str=''
while [ $i -le 100 ]
do
	index=i%4
	printf "[%-100s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}"
	str+='#'
	let i++
	sleep 0.1
done