Shell Script

第一行通常這樣寫 #!/bin/bashshell

#! 是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行,即便用哪種 Shell。bash

hello world

#!/bin/bash函數

echo "hello world"工具

保存爲t.sh,而後 chmod +x ./t.sh  賦予這個文件可執行權限oop

變量

首個字符必須爲字母,可使用下劃線_,不能使用標點符號,不能用bash的關鍵字,賦值變量的時候跟等號之間不能有空格spa

使用變量的時候,要在變量前加上$,變量最好加上花括號,好比字符串

name="tracy"input

echo ${name}數學

只讀變量:只讀變量的值不能被改變  it

readonly name

 

運算符

原生的bash不支持簡單的數學運算,可是能夠經過其餘的命令來實現。好比 awk 和 expr。expr最經常使用。expr 是一款表達式計算工具,使用它能完成表達式的求值操做。好比

val=`expr 2 + 2`

echo "val = $val"

結果:val = 4

注意:1.表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2 

2.完整的表達式要被 ` ` 包含 (esc下面這個鍵)

 

布爾運算符:! -o -a 分別表明非,或,與

 

流程控制

條件控制

name="tracy"

if [ $name = "tracy" ]

then

  echo 'name = tracy'

fi

注意判斷語句要加上 [ ] ,而且要空格,若是then要寫在上面一行的話,上一行要先加上分號隔開一下。好比

if [ $name = "tracy" ];then ..... 之後還有相似的狀況,總之就是,若是寫在一行要記得用分號隔開。

 

for循環

for loop in 1 2 3 4 5

do

  echo "the value is:$loop"

done

 

while循環

int=1

while(( int < 5 ))

do

  echo $int

  let 'int++'

done

 

函數

無參數,無返回值的函數

myfun(){

  echo 'my first shell fun'

}

myfun  #函數調用,不須要加括號

 

無參數,有返回值

sum(){

  echo "input a num"

  read num_a

  echo "input another num"

  read num_b

  return $(( $num_a + $num_b ))

}

sum

echo "sum is $? "

注意:在函數調用後使用$?來獲取返回值

 

帶參數的函數

funWithPara(){
  echo "the first para is $1"
  echo "the second para is $2"
  echo "the third para is $3"
}
funWithPara 1 2 3

經過$n來獲取參數的值,$1表示第一個參數,以此類推。$#表示傳進來的參數的總數,$*以字符串的形式顯示全部傳進來的參數

 

輸入\輸出重定向

一般來講, UNIX 系統命令從你的終端接受輸入並將所產生的輸出發送回​​到您的終端。

1.輸出重定向

格式:command>file

echo "hello world" > a

cat a  # hello world

注意若是文件a裏有內容,那麼上面代碼是會覆蓋掉裏面的內容的,若是不想覆蓋,要使用 >> ,這樣就會加在內容末尾(以追加的方式)

2.輸入重定向

格式:command < file

wc -l < t.sh  # 打印出文件打行數

 

通常狀況下,每一個 Unix/Linux 命令運行時都會打開三個文件

 

  • 標準輸入文件(stdin):stdin的文件描述符爲0,Unix程序默認從stdin讀取數據。
  • 標準輸出文件(stdout):stdout 的文件描述符爲1,Unix程序默認向stdout輸出數據。
  • 標準錯誤文件(stderr):stderr的文件描述符爲2,Unix程序會向stderr流中寫入錯誤信息。

若是但願 stderr 重定向到 file,能夠這樣寫 

command 2 > file

 

若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫:

command > file 2>&或者  command >> file 2>&1

 

 

3.Here Document

格式:

command << delimiter
       document
delimiter

注意:1.結尾的delimiter 必定要頂格寫,前面不能有任何字符,後面也不能有任何字符,包括空格和 tab 縮進。

2.開始的delimiter先後的空格會被忽略掉。

3.我試了下,delimiter能夠寫aaa,bbb什麼的,這玩意只是用來界定開始結束的,網上通常你們都寫EOF。

cat << aa
go lakers
go shell
aa

 

/dev/null

若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null

command > /dev/null   好比  echo "hello world" > /dev/null

 

/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;若是嘗試從該文件讀取內容,那麼什麼也讀不到。可是 /dev/null 文件很是有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。

 

若是但願屏蔽 stdout 和 stderr,能夠這樣寫:

command > /dev/null 2>&1

文件包含

包含一個文件用

. filename #注意點和filename之間的空格

或者

source filename這兩種形式均可以包含進來

好比

新建一個文件t1.sh

#!/bin/bash
val="i am val"

 

新建一個文件t.sh

#!/bin/bash
#. ./t1.sh
source ./t1.sh
echo "the val is $val"

 

結果:    the val is i am val

注意:被包含的文件不須要可執行權限

 

刪除多個帳號

好比有5個帳號分別是myquota1,myquota2,myquota3,myquota4,myquota5,要刪掉他們,寫以下腳本

#!/etc/bash

users=`grep "myquota*" /etc/passwd | cut -d ':' -f1`

for username in $users
do
userdel -r $username
done

 

執行完,再看看 grep myquota* /etc/passwd 發現已經刪除掉了

相關文章
相關標籤/搜索