進階bash編程指南(七)

來源:互聯網
上載者:User

一 命令替換

1.命令替換的兩種形式

(1)var=`basename $0`

(2)var=$(basename $0)

2.命令替換會調用一個subshell

3.

(1)command `echo a b`   #2args: and b

(2)command "`echo a b`"  #1args:"a b"

(3)dir=`ls -l`

echo $dir  #換行消失

echo "$dir"  #

4.

var1=`<file1`

var2=`cat file2`  #var1 and var2 分別是file1 和file2檔案的內容

5.變數替換允許將以個迴圈的輸出放入一個變數中

var=`for i in 1 2 3 4 5

do

  echo -n $"$i"

done`      #var=12345

6.

#include <stdio.h>

int main()

{

printf("Hello World!");

return 0;

}

#!/bin/bash

greeting=`./a.out`

echo $greeting

exit 0

7.對於命令替換而言,$()形式已經取代了``

兩種形式在下面的情況下輸出並不相同

(1)echo `echo \\`  #

(2)echo $(echo \\)  #\

(3)$(...)形式的命令替換允許嵌套

word_count=$(wc -w $(echo "test.sh"))  

二 算數擴充

算數擴充的集中形式

a=100

(1)var=`expr $a  +  3`  #“+”兩邊的空格是不能缺少的

否則var=100+3

(2)雙括弧形式

((...)) 獨立執行,不能對其他變數賦值  $((...)),不能單獨執行,

用於對其他變數進行賦值

((var+=3))

var=$((var+3))

var=$(($var+3))  #這種形式下+兩邊可以有空格

(3)let var+=3

let "var+=3"

三 I/O重新導向

1.

: > filename  #把檔案filename截斷為0長度,不存在,則建立

:是一個預留位置,不產成任何輸出,去掉:在某些shell中可能會

有問題

2.stdin,stdout,stderr的檔案描述符分別是0,1,2

(1)當他們出現在>,>>右邊的時候需要在前面加&

(2)i>&j  重新導向檔案描述符i到j

(3)<filename 從檔案接受輸入,不能是命令

(4)[j]<>filename

為了讀寫filename,把檔案filename開啟,並分配檔案

描述符j給它,如果檔案filename不存在,則建立它

,如果檔案描述符j沒制定,預設0

3.

(1) exec 6<&0  #檔案描述符儲存了stdin

exec <datafile

read a1

read a2

exec 0<&6 6<&-  #從fd6中恢複stdin,關閉fd6

(2)exec 6>&1  #fd6儲存了stdout

exec >$LOGFILE

echo "data"

exec 1>&6 6>&-  #從fd6中回複stdout,關閉fd6

四 代碼塊重新導向

像while,until,fo ,if/then和函數都可以重新導向(輸出或者輸入重新導向,同時也可)

(1)while [ .... ];do

.....

done <"$filename" #另一種方法就是用上面剛講過的內容也可

(2)until [ ... ];do

...

done <"$filename"

(3)for var [in list]

do

...

done < "$filename"

(4)if [ ... ]

then

...

fi < "$filename"

(5)

show()

{

}<"$filename"

五 Here Documents

1.here document就是一段特殊目的的代碼塊,使用I/O重新導向的形式將一個命令序列傳遞到一個互動程式或者命令中,

(1)command <<HEREDOCUMENT

HEREDOCUMENT

(2)here document中可以使用參數替換

(3)當<<後面的HEREDOCUMENT加單引號,雙引號或者\時,關閉參數替換

(4)用來產生指令碼

(cat <<'EOF'

#inlcude <stdio.h>

int main()

{

printf("Hello Shell!\n");

return 0;

}

EOF)>$filename

(5)為同一指令碼中的函數提供參數

show()

{

read firstname

read lastname

}

show<<CONTENT

Zone

Guo

CONTENT

(6)here strings COMMAND<<<$WORD

#  $WORD將被擴充並送入COMMAND的stdin中

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.