Shell脚本解释代码和参数

时间:2018-03-28 16:21:11

标签: bash shell ubuntu

我有以下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文件而且它们不适用于它们。

谢谢!

2 个答案:

答案 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

并且可能会破坏脚本,所以我会小心改进它的建议。