在bash中执行的命令,有些参数经常会带个通配符的,但是你知道这个参数是何时展开的吗?
先来看下简单的bash小代码:
[zcm@debug #88]$cat del.sh
#!/bin/bash
if [ $# -lt 2 ]; then
echo "Usage: $0 <separator> <files>"
exit 1
fi
echo $1
echo $2
echo $3
再来看执行过程:
[zcm@debug #89]$./del.sh *.txt
a.txt
b.txt
c.txt
[zcm@debug #90]$./del.sh "*.txt"
Usage: ./del.sh <separator> <files>
[zcm@debug #91]$ls aad/
a.txt b.txt c.txt
[zcm@debug #92]$./del.sh aad/*.txt
aad/a.txt
aad/b.txt
aad/c.txt
[zcm@debug #93]$./del.sh "aad/*.txt"
Usage: ./del.sh <separator> <files>
[zcm@debug #94]$
看出区别了吗:输入参数中 *.txt 有一个带了双引号,一个没带,运行结果就不一样了。
结论:带双引号的*.txt在命令行中是当作一个整体传入的,但是不带双引号的*.txt在传给bash解释器之前就已经被替换为它的结果(即:a.txt b.txt c.txt)。
所以,带双引号的*.txt在运行时出错,提示参数个数不足,而另一个却因为输入参数个数充足,而没有提示出错!