Bash Shell脚本解释代码和参数

Bash Shell脚本解释代码和参数,bash,shell,ubuntu,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”

我有下面的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文件,它不能处理它们


谢谢

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
和一个正则表达式作为第二个参数,并转义了
$
s以防止shell尝试扩展它们

!/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;
第一个参数可能是filename或不带空格的文件名列表,它本身包含一个文件名列表。$2是在这些文件中搜索的关键字,这些文件首先按名称排序

第一个匹配会将该文件的一个副本发送到/tmp,可能是为了进一步处理,并会发送一条回显消息并终止程序。如果未找到匹配的文件,则会打印另一条消息

请注意,将$1掩蔽如下:

for i in $(sort "$1")
do   
将阻止通配符的扩展

script "dat-?.lst" foobar

并且可能会破坏脚本,因此我会仔细考虑改进它的建议。

——这段代码本质上是被破坏的。有关逐行读取文件的最佳实践,请参阅。(也就是说,面向行的文件作为一个整体不能安全地用于存储任意文件名列表,因为文件的名称可以包含换行符。唯一安全的存储方式是存储任意文件名,如任意C字符串、环境变量和C。以NUL分隔)。除此之外,不清楚你到底在问什么。是为了解释这段代码是如何工作的吗?它不能正常工作——它坏了。(在很多方面,我也已经介绍过了——如果您的文件中有一行
*
,它将被当前工作目录中所有内容的列表所取代)…您说“我的问题是这个”,但下面是一个陈述,而不是一个问题。另外,参见Meta StackOverflow——大家一致认为这些问题应该以“不清楚你在问什么”或“太宽泛”来结束。无论$1还是“$1”改变程序的语义。也许作者想将“dat?.lst”作为参数传递,而这个参数需要扩展?@userunknown:那将是一个非常尴尬的接口。如果是这种情况,脚本应该处理多个参数,并让shell执行全局绑定;然后最好重新设计接口,将模式作为第一个参数,剩下的参数将是文件。然后使用
script thing来匹配file1 file2 file3
,并允许
script thing匹配dat?.lst
@userunknown:因为脚本编写者甚至没有为
grep
语句引用扩展名
$2
,我认为这更多的是编剧的错误,而不是实际的设计特点。@gniourf_gniourf:AFAIK,这个问题是一个面试问题,你应该回答脚本的内容,而不是如何改进它。