0

我知道如果你用双引号将一个变量(包含一个文件名)括起来,它会扩展$*s 和反引号(')。例如cmp "$file1" "$file2",如果两个文件*的开头都包含 s 或其他任何“正常”的东西,那就没问题了。但是,如果文件在开头有任意数量的破折号,它将不起作用。相反,它将尝试执行 - 的字面意思,将其视为一个选项。你如何解决这个问题?

这将起作用:

var1=*file.txt
var2=*file2.txt

cmp "$var1" "$var2"

var1=-file.txt 
cmp "$var1" "$var2" 

会说 - 是一个无法识别的选项。有任何想法吗?

4

3 回答 3

2

大多数 shell 命令都支持 -- 选项来告诉他们该行的其余部分是实际参数,而不是选项。

于 2012-10-11T23:31:24.797 回答
1

刚刚测试:

solaris10$ var3=-ts
solaris10$ var4=ts1
solaris10$ cmp -- "$var3" "$var4"
-ts ts1 differ: char 10, line 1
solaris10$ 

工作得很好。

于 2012-10-11T23:38:59.063 回答
1

大多数命令将接受 a--来标记参数选项的结束,因此cmp -- "$var1" "$var2"应该可以工作。实际上这不是关于 shell 扩展值的问题,而是关于命令本身将传递的参数解释为文件名或选项的问题。

此外,如果它们是当前目录中的文件,您可以执行cmp ./"$var1" ./"$var2".

于 2012-10-11T23:32:09.750 回答