Linux bash中作为命令行参数的目录路径

Linux bash中作为命令行参数的目录路径,linux,bash,directory,command-line-arguments,Linux,Bash,Directory,Command Line Arguments,下面的bash脚本从给定的目录路径中找到一个.txt文件,然后从.txt文件中更改一个单词(将山更改为海) #!/bin/bash FILE=`find /home/abc/Documents/2011.11.* -type f -name "abc.txt"` sed -e 's/mountain/sea/g' $FILE 在这种情况下,我得到的输出是正常的。 我的问题是,如果我想把目录路径作为命令行参数,那么它就不起作用了。假设我将bash脚本修改为: #!/bin/bash FILE=

下面的bash脚本从给定的目录路径中找到一个
.txt
文件,然后从
.txt
文件中更改一个单词(将山更改为海)

#!/bin/bash
FILE=`find /home/abc/Documents/2011.11.* -type f -name "abc.txt"`
sed -e 's/mountain/sea/g' $FILE 
在这种情况下,我得到的输出是正常的。 我的问题是,如果我想把目录路径作为命令行参数,那么它就不起作用了。假设我将bash脚本修改为:

#!/bin/bash
FILE=`find $1 -type f -name "abc.txt"`
sed -e 's/mountain/sea/g' $FILE 
然后像这样调用它:

./test.sh /home/abc/Documents/2011.11.*
错误是:

./test.sh: line 2: /home/abc/Documents/2011.11.10/abc.txt: Permission denied

有人能建议如何作为命令行参数访问目录路径吗?

您不需要将
*
传递给脚本

让您的脚本如下所示:

#!/bin/bash

# some sanity checks here
path="$1"

find "$path".* -type f -name "abc.txt" -exec sed -i.bak 's/mountain/sea/g' '{}' \;
然后像这样运行:

./test.sh "/home/abc/Documents/2011.11"

PS:查看如何使用
-exec
选项直接从查找自身调用sed。

您的第一行应该是:

FILE=`find "$@" -type f -name "abc.txt"`

通配符将在调用脚本之前展开,因此您需要使用
“$@”
获取它展开到的所有目录,并将这些目录作为参数传递给
find

/test.sh*.txt
将使shell在调用test.sh之前展开该通配符,因此,它在功能上与
/test.sh file1.txt file2.txt file3.txt等相同。
目录的名称不是
2011.11
,而是
2011.11.10
。他需要通配符使其能够找到带有任何后缀的目录。