Unix & Shell 编程:命令行中的 "test" 内置和空格

Unix & Shell Programming: the "test" built-in and spaces on the command line

这是我第一次在 Whosebug 中提问。 这学期我刚开始学习 Unix 课程,我对命令行中的 "Space" 键感到非常困惑。以下是一些示例:

% set x1="005"
% test "$x1" = 5
% echo $status
1

第二行我在“$x1”之后和 5 之前得到了 space 键,我得到的结果为 1,这是正确的,因为它们是两个不同的字符串。但是如果我这样输入命令:

% set x1="005"
% test "$x1"=5
% echo $status
0

可以看到,在第二行,"$x1"之后和5之前没有space,但是测试结果返回0,是一样的。我不知道为什么会这样。因为当我做JAVA或者C++的时候,space真的没有这样的影响。 我知道这可能很愚蠢,但仍然希望你们能帮助我理解这一点,非常感谢,祝你有美好的一天:)

第一个将参数“005”、“=”和“5”传递给 test。这将测试字符串是否相等,它们是否相等。第二个将单个参数“005=5”传递给 testtest 传递单个参数时的行为是将其视为字符串并测试它是否为非空。是的,这是一个非空字符串。

在shell中,分词是在空格处进行的。所以第一个 test 看到三个参数,005=5。如果使用这三个参数调用,test 将第二个视为运算符,将第一个和第三个视为操作数。

但是,test "$x1"=5 在参数扩展和引号删除后变为 test 005=5。由于没有空格,因此不会执行进一步的分词(test 和它的单个参数之间除外)。

只有一个参数,test 检查非空参数,在本例中为真。

这是来自 POSIX Standard about test 的相关引述:

In the following list, , , , and represent the arguments presented to test:

0 arguments: Exit false (1).

1 argument: Exit true (0) if is not null; otherwise, exit false.

2 arguments:

If is '!', exit true if is null, false if is not null.

If is a unary primary, exit true if the unary test is true, false if the unary test is false.

Otherwise, produce unspecified results.

3 arguments:

If is a binary primary, perform the binary test of and .

If is '!', negate the two-argument test of and .

[OB XSI] [Option Start] If is '(' and is ')', perform the unary test of . [Option End] On systems that do not support the XSI option, the results are unspecified if is '(' and is ')'.

Otherwise, produce unspecified results.

4 arguments:

If is '!', negate the three-argument test of , , and .

[OB XSI] [Option Start] If is '(' and is ')', perform the two-argument test of and . [Option End] On systems that do not support the XSI option, the results are unspecified if is '(' and is ')'.

Otherwise, the results are unspecified.

>4 arguments: The results are unspecified.