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”传递给 test
。 test
传递单个参数时的行为是将其视为字符串并测试它是否为非空。是的,这是一个非空字符串。
在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.
这是我第一次在 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”传递给 test
。 test
传递单个参数时的行为是将其视为字符串并测试它是否为非空。是的,这是一个非空字符串。
在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.