高级bash编程指南(七)

一 命令替换

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中

posted @ 2011-03-18 16:20  xdzone  Views(340)  Comments(0Edit  收藏  举报