Shell教程(五):替代、引用機制、輸入輸出重新導向_Shell

來源:互聯網
上載者:User
替代是什麼。

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#

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.