理解閉包 js回收機制
一、shell概述
shell 的兩層含義:既是一種應用程式,又是一種程式設計語言 作為應用程式:互動式地解釋、執行使用者輸入的命令,將使用者的操作翻譯成機器可以識別的語言,完成相應功能,因而又可稱為shell命令解析器。shell 是使用者和 Linux 核心之間的介面程式
1、使用者在提示符下輸入的命令都由 shell 先解釋然後傳給 Linux 核心;
2、它呼叫了系統核心的大部分功能來執行程式、並以並行的方式協調各個程式的執行;
3、Linux 系統中提供了好幾種不同的 shell 命令直譯器,如 sh、ash、bash 等。一般預設使用 bash 作為預設的直譯器;
4、shell 是使用者跟核心通訊幾種方式的一種。
作為程式設計語言:它定義了各種變數和引數,並提供了許多在高階語言中才具有的控制結構,包括迴圈和分支完成類似於 windows 下批處理操作,簡化我們對系統的管理與應用程式的部署稱之為shell 指令碼。
shell指令碼是shell命令的有序集合c/c++等語言,屬於編譯性語言(編寫完成後需要使用編譯器完成編譯、彙編、連結等過程變為二進位制程式碼方可執行);shell 指令碼是一種指令碼語言,我們只需使用任意文字編輯器,按照語法編寫相應程式,增加可執行許可權,即可在安裝 shell 命令直譯器的環境下執行
shell 指令碼主要用於:幫助開發人員或系統管理員將複雜而又反覆的操作放在一個檔案中,通過簡單的一步執行操作完成相應任務, 從而解放他們的負擔。
二、shell語法
2.1 shell 指令碼的定義與執行
shell指令碼的程式碼編寫流程
第一步:指定shell指令碼檔案,一般以.sh作為字尾名,也可以不加,例如:test.sh
第二步:編寫程式碼#!/bin/bash # #!用於指定當前指令碼檔案的shell直譯器的型別,如不寫,則用預設的shell #shell指令碼是shell命令的有序集合,程式碼的構成就是命令 ls pwd echo "hello world"第三步:修改檔案許可權
chmod +x test.sh第四步:執行指令碼檔案 三種執行方式
./test.sh 增加可執行許可權後執行 bash test.sh 直接指定使用 bash 解釋 test.sh . test.sh(或source test.sh) 使用當前 shell 讀取解釋 test.sh
三種執行指令碼的方式不同點:
./和 bash 執行過程基本一致,後者明確指定 bash 直譯器去執行指令碼,指令碼中#!指定的直譯器不起作用前者首先檢測#!,使用#!指定的 shell,如果沒有使用預設的 shell
用./和 bash 去執行會在後臺啟動一個新的 shell 去執行指令碼
用.去執行指令碼不會啟動新的 shell,直接由當前的 shell 去解釋執行指令碼。
2.2 變數
2.2.1 自定義變數
#!/bin/bash #定義變數 #shell指令碼中沒有資料型別可言,所以定義變數時不需要加資料型別 #shell指令碼中,賦值操作時不能在等號兩邊加空格 #NUM = 100 #錯誤 NUM=100 #引用變數 # $變數名 取一個變數的值 i=$NUM #顯示變數 echo $NUM echo $i #清除變數 unset NUM echo "*************" echo $NUM #使用read從終端讀取資料儲存在變數中 read str echo "str = $str" #使用readonly建立一個只讀的變數 readonly n=999 echo "n = $n" #指定變數初始化後不能再次修改變數的值,只能使用 #n=666 #echo "n = $n"
2.2.2 環境變數
shell在開始執行時就已經定義了一些和系統的工作環境有關的變數,我們在shell中可以直接使用$name引用 一般在~/.bashrc或/etc/profile檔案中(系統自動呼叫的指令碼)使用export設定,允許使用者後來更改 設定環境變數: 方法1:臨時設定 在終端執行命令MYVAL=999 export MYVAL方法2:永久設定 需要在配置檔案(~/.bashrc或/etc/profile)中進行設定即可,設定完畢後需要通過source命令配置檔案立即生效 使用環境變數,一般環境變數類似c語言中的全域性變數,可以再shell指令碼檔案中任意使用
#!/bin/bash echo "You are welcome to use bash" echo "Current work dirctory is $PWD" echo "the host name is $HOSTNAME" echo "your home dir $HOME" echo "Your shell is $SHELL" echo "user env val is $MYVAL1"
2.2.3 預設變數
$#:傳給shell指令碼引數的數量 $*:傳給shell指令碼引數的內容 $1、$2、$3、...、$9:執行指令碼時傳遞給其的引數,用空格隔開 $?:命令執行後返回的狀態 "$?"用於檢查上一個命令執行是否正確(在Linux中,命令退出狀態為0表示該命令正確執 行,任何非0值表示命令出錯)。 $0:當前執行的程序名 $$:當前程序的程序號 "$$"變數最常見的用途是用作臨時檔案的名字以保證臨時檔案不會重複#! /bin/bash #位置變數$0 ‐ $9 儲存從終端輸入的每一個引數 echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$5 = $5" echo "\$6 = $6" echo "\$7 = $7" echo "\$8 = $8" echo "\$9 = $9" #如果超過9,需要加大括號 echo "\$10 = ${10}" #$#:儲存命令列傳入的引數的個數,不包括$0 echo "\$# = $#" #$@或者$*:儲存所有的命令列傳入的引數,但是不包括$0 echo "\$@ = $@" echo "\$* = $*" #$$:獲取當前程序的程序號 echo "\$$ = $$" #read NUM # $? 返回上一個命令執行的結果,如果執行成功,則$?的值為0,執行失敗,則為非0 ls echo "\$? = $?" ls asdfasdf echo "\$? = $?"
2.2.4 指令碼變數的特殊用法
""(雙引號):包含的變數會被解釋 ''(單引號):包含的變數會當做字串解釋 ``(數字鍵1左面的反引號):反引號中的內容作為系統命令,並執行其內容,可以替換輸出為一個變數 $ echo "today is `date` " today is 2012年07月29日星期日 12:55:21 CST \ 轉義字元:同c語言 \n \t \r \a等 echo命令需加-e轉義 (命令序列):由子shell來完成,不影響當前shell中的變數 { 命令序列 }:在當前shell中執行,會影響當前變數#!/bin/bash name="zhangsan" #雙引號裡面的特殊字元,會使用其特殊含義 string1="good moring $name" #單引號裡面的特殊字元,都會失去特殊含義 string2='good moring $name' echo $string1 echo $string2
#反引號:獲取一個shell命令的輸出結果,一般對有輸出結果的命令經常去使用,也可以使用$()與反引號等價 echo "today is date" echo "today is `date`" echo 'today is `date`' echo "My dir is $(ls)"
#轉義字元:使用時,需要在echo後面加上‐e選項 echo "**************" echo "this \n is\ta\ntest" echo ‐e "this \n is\ta\ntest" echo "**************"
num=100 #由子shell來完成,不影響當前shell中的變數 ( num=999;echo "1 $num" ) echo 1:$num #在當前shell中執行,會影響當前變數 { num=666; echo "2 $num"; } echo 2:$num
2.3 條件測試語句
在寫shell指令碼時,經常遇到的問題就是判斷字串是否相等,可能還要檢查檔案狀態或進行數字測試,只有這些測試完成才能做下一步動作 test命令:用於測試字串、檔案狀態和數字 test命令有兩種格式: test condition 或 [ condition ] 使用方括號時,要注意在條件兩邊加上空格 shell指令碼中的條件測試如下: 檔案測試、字串測試、數字測試、複合測試 測試語句一般與後面講的條件語句聯合使用2.3.1 檔案測試
1)按照檔案型別 -e 檔名 檔案是否存在 -s 檔名 是否為非空 -b 檔名 塊裝置檔案 -c 檔名 字元裝置檔案 -d 檔名 目錄檔案 -f 檔名 普通檔案 -L 檔名 軟連結檔案 -S 檔名 套接字檔案 -p 檔名 管道檔案 2)按照檔案許可權 -r 檔名 可讀 -w 檔名 可寫 -x 檔名 可執行 3)兩個檔案之間的比較 檔案1 -nt 檔案2 檔案1的修改時間是否比檔案2新 檔案1 -ot 檔案2 檔案1的修改時間是否比檔案2舊 檔案1 -ef 檔案2 兩個檔案的inode節點號是否一樣,用於判斷是否是硬連結#! /bin/bash echo "please input a filename >>> " read FILE test ‐e $FILE echo "存在?$?" test ‐s $FILE echo "非空?$?" [ ‐r $FILE ] echo "可讀?$?" [ ‐w $FILE ] echo "可寫?$?" [ ‐x $FILE ] echo "可執行?$?" test ‐b $FILE echo "塊裝置檔案?$?" test ‐c $FILE echo "字元裝置檔案?$?" test ‐d $FILE echo "目錄檔案?$?" test ‐f $FILE echo "普通檔案?$?" test ‐L $FILE echo "軟連結檔案?$?" test ‐S $FILE echo "套接字檔案?$?" test ‐p $FILE echo "管道檔案?$?"2.3.2 字串測試 s1 = s2 測試兩個字串的內容是否完全一樣 s1 != s2 測試兩個字串的內容是否有差異 -z s1 測試s1 字串的長度是否為0 -n s1 測試s1 字串的長度是否不為0
#! /bin/bash test "hello" = "hello" echo "相等?$?" test "hello" = "hella" echo "相等?$?" test "hello" != "hello" echo "不相等?$?" test "hello" != "hella" echo "不相等?$?" test ‐z "hello" echo "長度是否為0?$?" test ‐n "hello" echo "長度是否不為0?$?"