4

我有一段代码可以在目录中找到第一个文件:

bash~> $( echo eval "ls | head -1" )
arguprog.sh

然后将此片段添加到 if 语句中,如果该文件是 arguprog.sh,则运行一组不同的命令:

bash~>  if [[ $( echo eval "ls | head -1" ) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
FALSE

然而,这不是我想要的。即使第一个文件是 arguprog.sh,它也会返回 FALSE!

有没有办法解决这个问题,同时仍然完全在测试块内进行字符串比较?

4

3 回答 3

7

首先,eval它是邪恶的,尤其是在不需要它的时候。在您的情况下eval不需要

将您显示的编码恐惧替换为:

ls | head -1

并将其包含在您的测试语句中:

if [[ $(ls | head -1) = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi

但这是错误的和损坏的(见下文)。

现在更一般的事情:不要解析ls. 如果要在当前目录中查找第一个文件(或目录或...),请使用 glob 和以下方法:

shopt -s nullglob
files=( * )
# The array files contains the names of all the files (and directories...)
# in the current directory, sorted by name.
# The first one is given by the expansion of "${files[0]}". So:
if [[ "${files[0]}" = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi

请注意,您的方法,解析ls错误的。看:

$ # Create a new scratch dir
$ mkdir myscratchdir
$ # Go in there
$ cd myscratchdir
$ # touch a few files:
$ touch $'arguprog.sh\nwith a newline' "some other file"
$ # I created 2 files, none of them is exactly arguprog.sh. Now look:
$ if [[ $(ls | head -1) = "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi
TRUE
$ # HORROR!

对此有一些扭曲的解决方法,但实际上,最好的方法是我刚刚给你的方法。

完毕!

于 2012-12-28T15:50:20.927 回答
1

的值$( echo eval "ls | head -1" )不是,因此你"eval ls | head -1"得到."arguprog.sh"FALSE

看看这个:

$ a=$( echo eval "ls | head -1" )
$ echo $a
eval ls | head -1

arguprog.sh运行时看到的原因bash~> $( echo eval "ls | head -1" )是因为 bash 执行命令 iseval ls | head -1并返回结果 is arguprog.sh

为了在您的 if 语句中执行相同的操作,您还需要通过将其包含在另一组 中来执行它$(...),如下所示:

$ if [[ $($( echo eval "ls | head -1" )) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
TRUE

但不要那样做!简单地使用它要容易得多:

$ if [[ $(ls | head -1) == "arguprog.sh" ]]; then echo "TRUE"; else echo "FALSE"; fi;
TRUE

另请注意,解析的输出ls不是一个好习惯。有关详细信息,请参阅ParsingLs

于 2012-12-28T15:39:11.423 回答
0

试试这个方法:

 if [[ `ls | head -1` = "04 dynamic-programming.pdf" ]]; then 
      echo "TRUE"
 else 
      echo "FALSE"
 fi

您应该只使用=而不是==并跳过该eval部分。

于 2012-12-28T15:23:05.627 回答