高级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中