Tips for Shell(4)
时间:2006-04-27 来源:wolfssss
1. 以前经常把“;”当“&&”用,今天才知道二者是不同的(汗自己一个先),区别如下:
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。
2. 脚本用source、exec和直接执行的区别:
1.sh
代码:
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 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
代码:
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十三问》中的例子,小做修改:
# ./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限定因此词段被当成多个参数。
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限定因此词段被当成多个参数。
相关阅读 更多 +