shell簡單總結--符號
一、shell簡介
shell的作用是解釋執行用戶的命令,用戶輸入一條命令,shell就解釋一行【交互式】。另一種執行命令的方式是【批處理】,用戶事先寫一個shell腳本,其中有很多條命令,shell一次把這些命令執行完。shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到shell提示符下執行。shell腳本是解釋執行的,不需要編譯。
1、什麽是shell執行腳本
腳本的後綴一般為.sh
腳本一般由#!開頭,稱作“shebang”,後面跟的是解釋器
腳本註釋時為 # 開頭
執行時需要更改權限:chmod +x
*其實腳本就是一個文件,可以執行多行命令的文件。
shell腳本的第一行千萬不要寫錯:#!/bin/bash.
2、shell腳本的執行過程
shell會fork一個子進程並調用exec執行./test.sh這個程序,exec系統調用把子進程的代碼替換成shell腳本程序的代碼段,並從它的_start開始執行。但是這個腳本.sh文件是個腳本文件,根本沒有代碼段和_start函數。所以exec會執行另一種機制。
由於第一行用shebang指定了解釋器,則用解釋器程序代碼替換當前進程,並且從解釋器的_start開始,這個文本文件被當做命令行參數傳給解釋器。
*解釋型語言只需要解釋器解釋,不需要編譯器,如shell腳本語言;C語言是編譯型語言
二、shell變量
1、環境變量
環境變量可以從父進程傳給子進程,所以shell進程的環境變量可以從當前的shell進程傳給fork出來的子進程,用printenv可以顯示當前shell進程的環境變量。
*fork函數得到的子進程從父進程繼承了整個進程的地址空間,包括:進程上下文、進程堆棧、內存信息、打開的文件描述符、信號控制設置、進程優先級、進程組號、當前工作目錄、根目錄。資源限制、控制終端、環境變量等。但是父進程設置的鎖子進程不繼承且子進程的未決信號集被設置為空集。
2、本地變量
只存在當前shell進程,用set命令可以顯示當前shell進程中定義的所有變量,包括本地和環境變量。
當定義環境變量時,等號的兩邊不能有空格,否則會被shell解釋為命令和命令行參數。一個變量定義後進存在當前shell進程,是本地變量,用export可以把本地變量導出為環境變量。
用unset可以刪除已定義的環境變量
VARNAME=value #定義本地變量
export VARNAME=value #導出本地變量,也可以寫為VARNAME=value;
export VARNAME
unset VARNAME #刪除已定義的環境變量或本地變量
3、變量引用
如果一個變量叫做VARNAME,用${VARNAME}可以表示它的值,在不引起歧義的情況下也
可以 用$VARNAME表示它的值。通過以下例子比較這兩種表示法的不同:
echo $SHELL
echo $SHELLabc
對比:
echo ${SHELL}
echo ${SHELL}abc
註意,在定義變量時不用$,取變量值時要用$。和C語言不同的是,Shell變量不需要明確定義類型,事實上Shell變量的值都是字符串,比如我們定義VAR=45,其實VAR的值是字符串45而非整數。Shell變量不需要先定義後使用,如果對一個沒有定義的變量取值,則值為空字符串。
三、替換
1、文件名代換
這些用於匹配的字符稱為通配符(Wildcard),具體如下:
通配符 * : 匹配0個或多個任意字符
? : 匹配一個任意字符
[若幹字符] : 匹配方括號中任意一個字符的一次出現
$ ls /dev/ttyS*
$ ls ch0?.doc
$ ls ch0[0-2].doc
$ ls ch[012][0-9].doc
註意,Globbing所匹配的文件名是由Shell展開的,也就是說在參數還沒傳給程序之前已經展開了, 比如上述ls ch0[012].doc命令,如果當前目錄下有ch00.doc和ch02.doc,則傳給ls命令的參數實際上是這兩個文件名,而不是一個匹配字符串。
2.命令行代換
由反引號括起來的也是一條命令,Shell先執行該命令,然後將輸出結果立刻代換到當前命令行中。
$ DATE=`date`
$ echo $DATE
例如定義一個變量存放date命令的輸出:
命令代換也可以用$()表示: $ DATE=$(date)
算術代換:$(())
用於算術計算,$(())中的Shell變量取值將轉換成整數,例如:
$ VAR=45
$ echo $(($VAR+3))
$(())中只能用+-*/和()運算符,並且只能做整數運算。
四、轉義字符\
\反斜杠被用作轉義字符,用於去除緊跟其後的單個字符的特殊意義。
例:
touch $ $ #創建一個名為 $的文件
touch \$\ \$ #創建一個名為 $ $的文件(中間有空格)
還有一個字符雖然不具有特殊含義,但是要用它做文件名也很麻煩,就是-號。如果要創建一個文件名以-號開頭的文件,這樣是不行的: 即使加上\轉義也還是報錯: 因為各種UNIX命令都把-號開頭的命令行參數當作命令的選項,而不會當作文件名。如果非要處理 以-號開頭的文件名,可以有兩種辦法:
touch ./-hello #前面加上當前路徑
touch -- -file #前面加上兩個--
五、單引號和雙引號
1、單引號
和C語言不一樣,Shell腳本中的單引號和雙引號一樣都是字符串的界定符,而不是字符的界定符。單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外, 但是字符串中不能出現單引號。如果引號沒有配對就輸入回車,Shell會給出續行提示符,要求用戶把引號配上對。
2、雙引號
雙引號用於保持引號內所有字符的字面值(回車也不例外),但以下情況除外:
$加變量名可以取變量的值
反引號仍表示命令替換
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值 除以上情況之外,在其它字符前面的\無特殊含義,只表示字面值
shell簡單總結--符號