Perl系统调用必须准确发送单个字符和单个字符。双引号' "

时间:2017-11-16 12:43:26

标签: shell perl ksh cleartool

Perl系统调用必须将以下字符串发送到UnixShell

'"XYZ"'

在我的Perl脚本中,我使用了以下命令:

system("cleartool mkattr -replace ATTRIBUTE '"$attribute"' lbtype:$label");

除了使用引号字符外,所有内容都传递给Shell Unix

'

实际上,

cleartool mkattr -replace ATTRIBUTE

上面的命令被传递,因为它正是我想要的。 Perl变量$ attribute和$ label被很好地解释。 但我不知道该如何做才能获得:

'"XYZ"'

这里XYZ是Perl变量$属性的值 操作系统为AIX (Unix)Shellksh。 cleartool是Clearcase的命令行界面,但没有必要的Clearcase技能来解决我的问题。

2 个答案:

答案 0 :(得分:7)

如果您想执行系统命令并且不必使用任何shell语法(如重定向),那么使用system的列表形式通常会更好更安全:

system(
    'cleartool',  'mkattr', '-replace', 'ATTRIBUTE',
    qq{"$attribute"}, qq{lbtype:$label}
);
# or, if you really want to pass both types of quotes:
system(
    'cleartool',  'mkattr', '-replace', 'ATTRIBUTE',
    qq{'"$attribute"'}, qq{lbtype:$label}
);

请参阅perldoc -f system

如果您想通过'"XYZ"'"XYZ",请问您的问题不明确。

答案 1 :(得分:1)

请参阅"Quote and Quote like Operators"并使用qq{...}

system(qq{cleartool mkattr -replace ATTRIBUTE '"$attribute"' lbtype:$label});

qq{...}"..."完全相同,但您可以在字符串中使用双引号",而无需转义

您可以在qq之后直接使用任何字符,然后必须使用相同的字符来表示字符串结尾,即qqX...X将以相同的方式工作。如果你的字符串包含Xes,你会遇到问题,所以不要这样做。

您还可以使用配对的字符作为分隔符({}()<>),这是您通常会看到的内容。