我有以下shell脚本,他们让我知道如何工作以及$ 1和$ 2参数是什么。
#!/bin/bash
for i in `sort $1`; do
if grep $2 $i > /dev/null; then
echo A
cp $i /tmp
exit
fi
done
echo B;
我的问题是:$ 1不能是目录,因为你无法对目录进行排序。因此,它必须是一个文件。但是“for i in file”函数意味着我们将为每一行工作,而'grep'工具不适用于行。
我认为它应该是一个包含文件的文件,但是现在我只能想到tar文件而且它们不适用于它们。
谢谢!
答案 0 :(得分:1)
sort $1
最有可能意味着$1
包含文件的路径。该文件的内容很可能是其他文件的路径。在其未引用的形式中,它将受到分词和全局扩展的影响。这可能是一种疏忽或预期的行为(例如,它会将'dat?.lst'
扩展为文件列表,如评论中所述。
for
循环假设这些路径都不包含任何笨拙的字符(空格,像*
这样的全局字符),并遍历排序输出中的每个单词。
$2
(同样应该是"$2"
)是一种在文件$i
中搜索的模式。如果文件的内容与模式匹配,则文件将复制到/tmp
并退出脚本。
鉴于不使用包含换行符的文件名的警告,最简单的修复方法是:
#!/bin/bash
sort "$1" | while read -r file; do
if grep -q "$2" "$file" 2>/dev/null; then
echo A
cp "$file" /tmp
exit
fi
done
这假设脚本作为第一个参数传递给文件的路径,如:
/path/to/first/file
/path/to/second/file
正则表达式作为第二个参数,$
被转义以防止shell尝试扩展它们。
答案 1 :(得分:1)
!/bin/bash
for i in `sort $1`
do
if grep $2 $i > /dev/null
then
echo A
cp $i /tmp
exit
fi
done
echo B;
第一个参数可能是文件名或没有空格的文件名列表,它本身包含文件名列表。 $ 2是在这些文件中搜索的关键字,这些文件首先按名称排序。
第一个匹配导致该文件的副本到/ tmp - 可能用于进一步处理,回显消息A和程序终止。如果未找到匹配的文件,则会打印另一条消息。
注意,屏蔽这样的$ 1:
for i in $(sort "$1")
do
将阻止通配符的扩展,
script "dat-?.lst" foobar
并且可能会破坏脚本,所以我会小心改进它的建议。