Chinaunix首页 | 论坛 | 博客
  • 博客访问: 662260
  • 博文数量: 137
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 1335
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-23 15:18
文章分类

全部博文(137)

文章存档

2010年(2)

2009年(2)

2008年(2)

2007年(30)

2006年(99)

2005年(2)

我的朋友

分类:

2006-04-27 11:11:59

1. 以前经常把“;”当“&&”用,今天才知道二者是不同的(汗自己一个先),区别如下:

; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。

2. 脚本用source、exec和直接执行的区别:
1.sh
代码:
#!/bin/bash
A=B
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
exec)
echo "using exec..."
exec ./2.sh ;;
source)
echo "using source..."
. ./2.sh ;;
*)
echo "using fork by default..."
./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"



2.sh
代码:
#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"


# ./1.sh
PID for 1.sh before exec/source/fork:10699
1.sh: $A is B
using fork by default...
PID for 2.sh: 10700
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:10699
1.sh: $A is B

我们可以看到直接执行,1.sh创建了一个子进程来运行2.sh,虽然2.sh改变了A的值但回到父进程中A的值仍然不变。

# ./1.sh source
PID for 1.sh before exec/source/fork:10701
1.sh: $A is B
using source...
PID for 2.sh: 10701
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:10701
1.sh: $A is C

用source的方式执行脚本1.sh,它调用的2.sh仍然和1.sh运行在同一进程内,因此2.sh改变了A的值。

# ./1.sh exec
PID for 1.sh before exec/source/fork:10702
1.sh: $A is B
using exec...
PID for 2.sh: 10702
2.sh get $A=B from 1.sh
2.sh: $A is C

用exec的方式执行脚本1.sh,虽然1.sh和2.sh仍在同一进程内,但2.sh执行完后退出进程,导致1.sh的最后两句没能执行。

由此可见三者的区别。

3. 对$()、${}、$(())区别不清楚的一定要参考"网中人"的《Shell十三问》
简单的说$()相当于``,${}限定范围,$(())用做数学计算。

4. “$@”与“$*”的细微差别
用《Shell十三问》中的例子,小做修改:
1  #!/bin/bash
2 my_fun() {
3 echo "$#"
4 echo $1
5 }
6 echo 'the number of parameter in "$@" is '$(my_fun "$@")
7 echo 'the number of parameter in "$*" is '$(my_fun "$*")
8 echo 'the number of parameter in $@ is '$(my_fun $@)
9 echo 'the number of parameter in $* is '$(my_fun $*)
运行结果如下:
# ./3.sh p1 "p2 p3" p4
the number of parameter in "$@" is 3 p1
the number of parameter in "$*" is 1 p1 p2 p3 p4
the number of parameter in $@ is 4 p1
the number of parameter in $* is 4 p1

可见,用"$@"能很好的还原,用"$*"则会把整个字段作为一个词段,而$@和$*则先被展开但又没被soft quote限定因此词段被当成多个参数。



阅读(1972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~