Shell 脚本的引用规则-c';命令';
我正在寻找传递给Shell 脚本的引用规则-c';命令';,shell,Shell,我正在寻找传递给script-c command的命令的引用/拆分规则。手册上说 -c, --command command: Run the command rather than an interactive shell. 但是我想确保“command”被正确转义。command参数只是一个常规字符串,shell将其处理为文件的摘录。我们可能认为-c命令在功能上等同于 printf '%s' COMMAND > /tmp/command_to_execute.sh sh /tmp/c
script-c command
的命令的引用/拆分规则。手册上说
-c, --command command: Run the command rather than an interactive shell.
但是我想确保“command”被正确转义。command参数只是一个常规字符串,shell将其处理为文件的摘录。我们可能认为
-c命令
在功能上等同于
printf '%s' COMMAND > /tmp/command_to_execute.sh
sh /tmp/command_to_execute.sh
然而,form-c命令
优于辅助文件的版本,因为它避免了与使用辅助文件相关的争用条件
在-c命令
选项的典型用法中,我们将命令
作为单引号字符串传递,如以下伪代码示例所示:
sh -c '
do_some_complicated_tests "$1" "$2";
if something; then
proceed_this_way "$1" "$2";
else
proceed_that_way "$1" "$2";
fi' ARGV0 ARGV1 ARGV2
如果命令必须包含单引号字符串,我们可以依靠printf
来构建命令
字符串,但这可能会很繁琐。举例说明了这种技术
通过这里定义的过于复杂的grep
-like命令
:
% AWKSCRIPT='$0 ~ expr {print($0)}'
% COMMAND=$(printf 'awk -v expr="$1" \047%s\047' "$AWKSCRIPT")
% sh -c "$COMMAND" print_matching 'tuning' < /usr/share/games/fortune/freebsd-tips
"man tuning" gives some tips how to tune performance of your FreeBSD system.
%AWKSCRIPT='$0~expr{print($0)}'
%COMMAND=$(printf'awk-v expr=“$1”\047%s\047'$AWKSCRIPT”)
%sh-c“$COMMAND”打印匹配“调优”
回想一下,047
是单引号字符ASCII码的八进制表示
作为旁注,这些构造在Makefiles中非常重要,它们可以在其中替换。该命令仅由shell运行,正常的引用规则适用。但它也由您正在键入的shell处理,因此您需要遵守其引用规则。但剧本并没有什么特别的规定。它就像
bash-c commmand
。在一行cmd上键入的任何内容都可以用作-c
的字符串目标。它必须被引用,所以它是一个字符串。这很好,直到您想在内部使用一个外部引用字符,比如-c'ls-l | awk'{print$9}'
oops。对于这种情况,您可以在外部使用dbl引号,但是$9
将被解释为shell cmd行arg,因此您必须避开它,例如-c''ls-l | awk'{print\$9}'
等。您的问题太模糊,无法进一步回答。如果你有不起作用的具体案例,那么将其作为新问题发布。祝你好运。不,事实上这已经够好了,我想出来了,谢谢。