在Linux中perl中转义双引号
问题描述:
它不让我在这里使用Linux作为操作系统回复评论。 我正在使用下述内容获取创建的票据,但-k参数,重复参数在“”中获取消息,如果消息中有“”,则这些参数会混乱并且消息不会被转发。 如何在-k参数中使用这些双引号以便通过? 在此先感谢在Linux中perl中转义双引号
#!/usr/bin/perl
use strict;
use Getopt::Std;
# declare the perl command line flags/options we want to allow
# Define the environment
my %option=();
my $SEND_OUTPUT = "" ;
my $MODE = "Prod" ;
my $SENDEVENT_LOG = "";
my $DATE = "" ;
my $SEND_EVENT = "";
my $SEND_OUTPUT_LOG = "" ;
my $DSOM_SEV = "" ;
getopts("q:a:n:p:s:k:c:m:t:y:z:", \%option);
# Define the environment
if ($MODE =~ m/Prod/i) {
$SENDEVENT_LOG="/var/opt/SendEvent/log/SendEvent.log";
}
if ($MODE =~ m/Dev/i) {
$SENDEVENT_LOG="/var/opt/SendEvent/log/SendEvent.Dev.log";
}
# Define time stamp
my $DATE=`date +%Y:%m:%d:\%T`; chomp $DATE ; my $TIME=`date +%T`; chomp $TIME; my $NOW=$DATE." ";
# Open Logfile and define the Date Variable
open (LOGFILE, ">>${SENDEVENT_LOG}") or die ("Cannot open SendEvent log file ");
# test for the existence of the options on the command line.
# in a normal program you'd do more than just print these.
print LOGFILE "$DATE *******************************************************************\n";
print LOGFILE "\n$DATE New Instance of SendEvent initiated\n" ;
print LOGFILE "$DATE Examine the input arguments below to validate this instance of SendEvent\n\n" ;
print "\n\n" ;
if ($option{q}) { print LOGFILE "$DATE -q $option{q}\n" } else { print LOGFILE "$DATE -q **** value missing *****\n" }
if ($option{a}) { print LOGFILE "$DATE -a $option{a}\n" } else { print LOGFILE "$DATE -a **** value missing *****\n" }
if ($option{n}) { print LOGFILE "$DATE -n $option{n}\n" } else { print LOGFILE "$DATE -n **** value missing *****\n" }
if ($option{p}) { print LOGFILE "$DATE -p $option{p}\n" } else { print LOGFILE "$DATE -p **** value missing *****\n" }
if ($option{s}) { print LOGFILE "$DATE -s $option{s}\n" } else { print LOGFILE "$DATE -s **** value missing *****\n" }
if ($option{k}) { print LOGFILE "$DATE -k $option{k}\n" } else { print LOGFILE "$DATE -k **** value missing *****\n" }
if ($option{c}) { print LOGFILE "$DATE -c $option{c}\n" } else { print LOGFILE "$DATE -c **** value missing *****\n" }
if ($option{m}) { print LOGFILE "$DATE -m $option{m}\n" } else { print LOGFILE "$DATE -m **** value missing *****\n" }
if ($option{t}) { print LOGFILE "$DATE -t $option{t}\n" } else { print LOGFILE "$DATE -t **** value missing *****\n" }
if ($option{y}) { print LOGFILE "$DATE -y $option{y}\n" } else { print LOGFILE "$DATE -y **** value missing *****\n" }
if ($option{z}) { print LOGFILE "$DATE -z $option{z}\n" } else { print LOGFILE "$DATE -z **** value missing *****\n" }
# other things found on the command line
print LOGFILE "$DATE Other things found on the command line:\n" if $ARGV[0];
foreach (@ARGV)
{
print LOGFILE "$DATE $_\n";
}
my $TOOL = "$option{q}" ;
my $MSG_APPL = "$option{a}" ;
my $MSG_NODE_NAME = "$option{n}" ;
my $ESM_PROFILE = "$option{p}" ;
my $MSG_SEV = "$option{s}" ;
my $DEDUPLICATION = "$option{k}" ;
my $MANAGEMENT_ID = "$option{c}" ;
my $LONG_TEXT = "$option{m}" ;
my $SHORT_TEXT = "$option{t}" ;
my $DEFAULT_Q = "$option{y}" ;
my $ACCOUNT = "$option{z}" ;
# Translate OpenView Severity to DSOM Severity
# OpenView Sev DSOM Sev
if ($MSG_SEV =~ m/Critical/i) { $DSOM_SEV = "FATAL" }
if ($MSG_SEV =~ m/Major/i ) { $DSOM_SEV = "CRITICAL" }
if ($MSG_SEV =~ m/Minor/i ) { $DSOM_SEV = "MINOR" }
if ($MSG_SEV =~ m/Warning/i ) { $DSOM_SEV = "WARNING" }
if ($MSG_SEV =~ m/Normal/i ) { $DSOM_SEV = "HARMLESS" }
print LOGFILE "\n$DATE Translating Openview Severity to DSOM Severity, $MSG_SEV => $DSOM_SEV\n\n" ;
$SEND_OUTPUT_LOG = "/opt/SendEvent/dist/SendEvent/SendEvent send -q \"$TOOL\" -a \"$MSG_APPL\" -n \"$MSG_NODE_NAME\" -p \"$ESM_PROFILE\" -s \"$DSOM_SEV\" -k \"$DEDUPLICATION\" -c \"$MANAGEMENT_ID\" -m \"$LONG_TEXT\" -t \"ABC $SHORT_TEXT\" -z \"ABC\" -y \"$DEFAULT_Q\"" ;
$SEND_EVENT=`/opt/SendEvent/dist/SendEvent/SendEvent send -q "$TOOL" -a "$MSG_APPL" -n "$MSG_NODE_NAME" -p "$ESM_PROFILE" -s "$DSOM_SEV" -k "$DEDUPLICATION" -c "$MANAGEMENT_ID" -m "$LONG_TEXT" -t "ABC $SHORT_TEXT" -z "ABC" -y \"$DEFAULT_Q\"` ;
print LOGFILE "$DATE \n$SEND_EVENT\n\n" ;
print LOGFILE "$DATE $SEND_OUTPUT_LOG\n\n" ;
答
对我来说,引用壳插一个变量的最简单方法是:
- 括在
''
- 更换任何
'
与'"'"'
所以替换
$SEND_EVENT=`/opt/SendEvent/dist/SendEvent/SendEvent send -q "$TOOL" -a "$MSG_APPL" -n "$MSG_NODE_NAME" -p "$ESM_PROFILE" -s "$DSOM_SEV" -k "$DEDUPLICATION" -c "$MANAGEMENT_ID" -m "$LONG_TEXT" -t "ABC $SHORT_TEXT" -z "ABC" -y \"$DEFAULT_Q\"` ;
与
(my $quoted_DEDUPLICATION = $DEDUPLICATION) =~ s/'/'"'"'/g;
$SEND_EVENT=`/opt/SendEvent/dist/SendEvent/SendEvent send -q "$TOOL" -a "$MSG_APPL" -n "$MSG_NODE_NAME" -p "$ESM_PROFILE" -s "$DSOM_SEV" -k '$quoted_DEDUPLICATION' -c "$MANAGEMENT_ID" -m "$LONG_TEXT" -t "ABC $SHORT_TEXT" -z "ABC" -y \"$DEFAULT_Q\"` ;
(做你的所有其他参数相同)。
或者,使用IPC :: System :: Simple :: capturex并传递数组中的所有参数。
你运行什么操作系统? – choroba
你会得到很多选票来关闭你的问题。这可能是因为那里有太多的代码,很难找到你正在谈论的部分。尽量缩小你发布的代码,以证明你的问题是必要的。 – ysth