unix 中带有 -c 选项的 Sh 命令

Sh command with -c option in unix

我正在尝试 运行 使用 sh -c

下面的一组命令
sh -c "
Dup_flag=`wc -l test.dat | awk '{print }'`;
user='test@domain.com';
text='Hi';
subject='Notification';
if [ $Dup_flag -eq 0 ];
then
  echo $Dup_flag | mailx -r $user -s $subject $user;
fi
"

它没有给出预期的结果

当我 运行 在脚本中相同时

Dup_flag=`wc -l test.dat | awk '{print }'`
user='user@domain.com'
text='Hi'
subject='Notification'
if [ $Dup_flag -eq 8 ]
then
  echo $Dup_flag | mailx -r $user -s $subject $user
fi

它给出了想要的结果

有人可以帮我解决我在这里做错的地方吗?我不得不 运行 他们只有 sh -c

谢谢

第一个版本失败,因为 double-quoted 参数由调用 sh -c "…your script…".

的 shell 处理

这意味着 wcawk 在调用 sh -c 之前是 运行。此外,各种变量引用 $Dup_flag 等是由调用 shell 计算的,而不是由调用的 shell.

计算的

您需要使用反斜杠来转义 back-ticks 和美元符号。即使您更改为 $(…) 表示法,您仍然必须转义 $.

或者在 sh -c '…your script…' 周围使用单引号,并在脚本中适当的地方使用双引号。

我以为我之前添加了 'Escapes' 和 'Single quotes' 部分。向 SO 的提交过程出现故障(暂停);可能是我的互联网连接出了问题,但我似乎在没有注意到它的情况下关闭了选项卡。

逃脱

sh -c "
Dup_flag=\`wc -l test.dat | awk '{print $1}'\`;
user='test@domain.com';
subject='Notification'
if [ $Dup_flag -eq 0 ]
then
  echo $Dup_flag | mailx -r $user -s $subject $user
fi
"

单引号

sh -c '
Dup_flag=`wc -l test.dat | awk "{print }"`
user="test@domain.com"
subject="Notification"
if [ "$Dup_flag" -eq 0 ]
then
  echo "$Dup_flag" | mailx -r "$user" -s "$subject" "$user"
fi
'

请注意,single-quoted 版本将使电子邮件的 multi-word 主题行等变得更加容易。

在这两个版本中,我都删除了 text,因为它未被使用。当命令分布在多行时,分号不是必需的(所以我删除了它们)。如果将它们全部压平到一条线上,它们将是必要的。


Actually, I need to run the mentioned commands in an Informatica command task which runs the commands as sh -c " my script ".

哎呀。这增加了一些可能的混淆级别。可能是 Informatica 代码创建了一个 shell 命令,如下所示:

char *args[] = { "sh", "-c", your_string, 0 };
execvp(args[0], args);

在那种情况下,我对你的问题的诊断是错误的;除了最后的 shell 什么都不会解释你的字符串的内容。

OTOH,他们可以使用:

char buffer[4096];
snprintf(buffer, sizeof(buffer), "sh -c \"%s\"", your_string);
system(buffer);

在这种情况下,system() 函数 运行 是一个 shell,它反过来分析 运行 是 shell 实际上 运行 是你的脚本。那么我的分析就生效了。

可能还有其他方法可以完成这项工作;它们的效果可能略有不同。

它在转义 $ 和 back-ticks

后起作用
sh -c "
Dup_flag=\`wc -l test.dat | awk '{print $1}'\`
user='user@domain.com';
text='Hi';
subject='Notification';

if [ $Dup_flag -eq 8 ]
then
  echo $Dup_flag | mailx -r $user -s $subject $user;
fi
"

谢谢乔纳森