Linux bash中作为命令行参数的目录路径
下面的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=
.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
。他需要通配符使其能够找到带有任何后缀的目录。