替代是什麼。
Shell當它遇到一個運算式,其中包含一個或多個特殊字元進行替代。 例子:
下面的例子,同時使列印取代的其值的變數的值。同時“ ”是一個新行取代:
#!/bin/sh
a=10
echo -e "Value of a is $a
"
這將產生下面的結果。這裡-e選項可以解釋反斜線轉義。
Value of a is 10
下面是結果沒有-e選項:
Value of a is 10
這裡echo命令可以用在以下逸出序列:
轉義
描述
\
backslash
a
alert (BEL)
backspace
c
suppress trailing newline
f
form feed
new line
carriage return
horizontal tab
v
vertical tab
可以使用-E選項禁用解釋反斜線轉義(預設)。
您可以使用-n選項來禁用插入新行。 命令替換:
命令替換shell執行的機制,一組給定的命令,然後替代它們的輸出在命令。 文法
執行命令替換的命令時,被給定為:
`command`
當執行命令替換,確保您使用的是反引號,不是單引號字元。 例子:
命令替換一般是用一個命令的輸出分配給一個變數。下面的例子示範命令替換:
#!/bin/sh
DATE=`date`
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ; uptime`
echo "Uptime is $UP"
這將產生以下結果:
Date is Thu Jul 2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul 2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03, 1 user, load avg: 0.13, 0.07, 0.15
變數替代:
變數替換可使Shell程式員操縱變數的值,根據其狀態。
這裡是所有可能的替換如下表:
格式
描述
${var}
Substitue the value of var.
${var:-word}
If var is null or unset, word is substituted for var. The value of var does not change.
${var:=word}
If var is null or unset, var is set to the value of word.
${var:?message}
If var is null or unset, message is printed to standard error. This checks that variables are set correctly.
${var:+word}
If var is set, word is substituted for var. The value of var does not change. 例子:
下面的例子顯示各種狀態,上述替代:
#!/bin/sh
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
這將產生以下結果:
Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix
元字元:
UNIX Shell提供各種元字元有特殊的意義,同時利用他們在任何Shell指令碼,並導致終止一個字,除非引用。
舉個例子: ?匹配一個單一的系統字元,而列出檔案中的目錄和*匹配多個字元。下面是一個清單shell特殊字元(也稱為元字元):
* ? [ ] ' " $ ; & ( ) | ^ < > new-line space tab
它與前可能被引用的字元(例如,放置自身) . 例子:
下面的例子,顯示了如何列印 a * 或a ?:
#!/bin/sh
echo Hello; Word
這將產生下面的結果。
Hello
./test.sh: line 2: Word: command not found
shell returned 127
現在,讓我們嘗試使用帶引號的字元:
#!/bin/sh
echo Hello; Word
這將產生以下結果:
Hello; Word
$符號是一個元字元,所以它必須被引用,以避免特殊處理:
#!/bin/sh
echo "I have $1200"
這將產生以下結果:
I have $1200
是以下四種形式引用:
引用
描述
Single quote
All special characters between these quotes lose their special meaning.
Double quote
Most special characters between these quotes lose their special meaning with these exceptions:
· $
· `
· $
· '
· "
· \
Backslash
Any character immediately following the backslash loses its special meaning.
Back Quote
Anything in between back quotes would be treated as a command and would be executed. 單引號:
考慮echo命令,其中包含許多特殊的shell字元:
echo <-$1500.**>; (update?) [y|n]
將在每個特殊字元前的反斜線是繁瑣的,使該行難以閱讀:
echo <-$1500.**>; (update?) [y|n]
有一個簡單的方法來引用一大組字元。將一個單引號(')的開頭和結尾的字串:
echo '<-$1500.**>; (update?) [y|n]'
單引號內的任何字元均以一個反斜線,就好像是在前面的每個字元。所以,現在這個echo命令將顯示正確。
如果要輸出一個字串內出現一個單引號,你不應該把單引號內的整個字串,而不是對子進行使用反斜線()如下:
echo 'It's Shell Programming'
雙引號:
嘗試執行以下shell指令碼。這個shell指令碼使用單引號:
VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
這將產生以下輸出結果:
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
所以這不是你想顯示什麼。很明顯,單引號防止變數替換。如果想替換的變數值和倒置逗號如預期那樣運作,那麼就需要在雙引號命令如下:
VAR=ZARA
echo "$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]"
這將產生以下結果:
ZARA owes <-$1500.**>; [ as of (07/02) ]
雙引號帶走下列以外的所有字元的特殊含義:
· $ 參數替代。
· 用於命令替換的反引號。
· $ 使字面美元標誌。
· ` 使文字反引號。
· " 啟用嵌入式雙引號。
· \ 啟用嵌入式反斜線。
· 所有其他字元是文字(而不是指定)。
單引號內的任何字元均以一個反斜線,就好像是在前面的每個字元。所以,現在這個echo命令將顯示正確。
如果要輸出一個字串內出現一個單引號,不應該把單引號內的整個字串,而不是對子進行使用反斜線()如下:
echo 'It's Shell Programming'
反引號:
把反引號之間的任何shell命令將執行命令 文法
下面是一個簡單的文法,把反引號之間的任何Shell命令: 例子:
var=`command`
例子:
繼執行date命令,產生的結果將被儲存在 DATA 變數。
DATE=`date`
echo "Current Date: $DATE"
這將產生以下輸出結果:
Current Date: Thu Jul 2 05:28:45 MST 2009
大多數 Unix 系統命令從終端的輸入和發送所產生的輸出返回到您的終端。一個命令通常從一個地方叫標準輸入,預設情況下,這恰好是你的終端讀取輸入。同樣,一個命令通常寫入其輸出到標準輸出,這也是預設情況下,從你的終端。 輸出重新導向:
通常用於標準輸出命令的輸出可以很容易地轉移到一個檔案中代替。這種能力被稱為輸出重新導向:
如果記號> file附加任何命令,通常寫入其輸出到標準輸出,該命令的輸出將被寫入檔案,而不是你的終端:
檢查使用 who 命令,將完整的輸出重新導向命令在使用者檔案。
$ who > users
請注意,沒有輸出出現在終端中。這是因為輸出已被重新導向到指定的檔案從預設的標準輸出裝置(終端)。如果想檢查使用者的檔案,然後將完整的內容:
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
如果命令輸出重新導向到一個檔案,該檔案已經包含了一些資料,這些資料將會丟失。考慮這個例子:
$ echo line 1 > users
$ cat users
line 1
$
您可以使用>>運算子將輸出附加在現有的檔案如下:
$ echo line 2 >> users
$ cat users
line 1
line 2
$
輸入重新導向:
正如一個命令的輸出可以被重新導向到一個檔案中,所以可以輸入一個命令從檔案重新導向。作為不是字元>用於輸出重新導向,小於字元<用於重新導向一個命令的輸入。
通常需要的命令,他們從標準輸入的輸入可以有自己的這種方式從檔案輸入重新導向。例如,上面產生的檔案中的使用者的數量來計算的行,可以執行如下命令:
$ wc -l users
2 users
$
在這裡,它產生的輸出2行。可以指望的檔案中的行數 wc 命令的標準輸入重新導向使用者從檔案:
$ wc -l < users
2
$
請注意,在由兩種形式的wc命令產生的輸出是有區別的。在第一種情況下,該檔案的使用者的名稱列出的行數,在第二種情況下,它不是。
在第一種情況下,wc 知道,它是使用者從檔案讀取輸入。在第二種情況下,只知道它是從標準輸入讀取輸入,所以它不顯示檔案名稱。 Here 文檔:
here document 是用來輸入重新導向到一個互動式shell指令碼或程式。
在一個shell指令碼中,我們可以運行一個互動式程式,無需使用者操作,通過提供互動程式或互動式shell指令碼所需的輸入。
這裡的檔案的一般形式是:
command << delimiter
document
delimiter
這裡的 shell 解釋<<操作指令讀取輸入,直到它找到含有指定分隔字元線。所有輸入行的行分隔字元,然後送入標準輸入的命令。
分界符告訴shell 這裡檔案已完成。沒有它,shell 不斷的讀取輸入。分隔字元必須是一個字不包含空格或定位字元。
以下是輸入命令wc -1 進行計數的行的總數:
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
可以在heredocument 列印多行,使用你的指令碼如下:
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
這將產生以下結果:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
下面的指令碼運行一個會話vi文字編輯器中的輸入和儲存檔案test.txt。
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
如果運行這個指令碼,用vim作為vi,那麼很可能會看到類似以下的輸出:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
運行該指令碼後,你應該看到以下內容添加到檔案test.txt:
$ cat test.txt
This file was created automatically from
a shell script
$
丟棄輸出:
有時會需要執行命令,但不想顯示在螢幕上的輸出。在這種情況下,可以丟棄的輸出重新導向到檔案 /dev/null:
$ command > /dev/null
這裡 command 是要執行的命令的名字。檔案/dev/null 是一個特殊的檔案自動放棄其所有的輸入。
同時要放棄一個命令的輸出和錯誤輸出,使用標準的重新導向到STDOUT 到STDERR重新導向:
$ command > /dev/null 2>&1
在這裡,2代表stderr和1代表STDOUT。可以上顯示一條訊息到STDERR到 STDERR重新導向標準輸入到如下:
$ echo message 1>&2
重新導向命令:
以下是命令,可以使用重新導向的完整列表:
命令
描述
pgm > file
Output of pgm is redirected to file
pgm < file
Program pgm reads its input from file.
pgm >> file
Output of pgm is appended to file.
n > file
Output from stream with descriptor n redirected to file.
n >> file
Output from stream with descriptor n appended to file.
n >& m
Merge output from stream n with stream m.
n <& m
Merge input from stream n with stream m.
<< tag
Standard input comes from here through next tag at start of line.
|
Takes output from one program, or process, and sends it to another.
需要注意的是檔案描述符0是正常標準輸入(STDIN),1是標準輸出(STDOUT),標準錯誤輸出(STDERR)。
from: http://www.yiibai.com/shell/what_is_shell.html#