繁体   English   中英

如何传递带有特殊字符的参数来调用shell脚本

[英]How to pass arguments with special characters to call shell script

使用如下所需的参数调用.sh(shell脚本): -

sh home/example.sh --context_param dbUserName=username --context_param dbPassword=exam!ple##### --context_param resultDate=2017-01-13

使用参数dbUsername和password调用example.sh但是出现以下错误: -

-bash:!ple #####:找不到事件

我认为特殊字符限制命令执行。 然后我如何传递特殊字符。 任何帮助都会很明显。

改变线,

dbPassword=exam!ple#####

至,

dbPassword='exam!ple#####'

避免! (历史扩张)在bash被特别对待

QUOTING子节下的man bash

使用命令历史记录扩展功能时(请参阅下面的历史记录扩展),必须引用历史记录扩展字符(通常为!)以防止历史记录扩展。

HISTORY EXPANSION下更多

历史扩展是由历史扩展角色的外观引入的,这是! 默认。 只有反斜杠( \\ )和单引号才能引用历史记录扩展字符。

此外,最好引用所有name-value对以防止shell完成分词。

sh home/example.sh --context_param dbUserName="username" --context_param dbPassword='exam!ple#####' --context_param resultDate="2017-01-13"

关于分词,从man页,

单词分裂

shell扫描参数扩展,命令替换和算术扩展的结果,这些结果在双引号内没有出现用于分词 shell将IFS每个字符视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词

像这样传递:

exam\!ple\#\#\#\#\#

测试:

echo exam\!ple\#\#\#\#\#

您可以执行以下两项操作:

  1. 使用反斜杠转义每个特殊符号

     sh home/example.sh --context_param dbUserName=username --context_param dbPassword=exam\\!ple\\#\\#\\#\\#\\# --context_param resultDate=2017-01-13 
  2. 单引出整个论点

     sh home/example.sh --context_param dbUserName=username --context_param dbPassword='exam!ple#####' --context_param resultDate=2017-01-13 

来自man bash

QUOTING

引用用于删除shell中某些字符或单词的特殊含义。 引用可用于禁用特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展。

当使用命令历史扩展设施时,通常是历史扩展字符! ,必须引用以防止历史扩张。

有三种引用机制: 转义字符单引号双引号

未引用的反斜杠(\\)是转义字符。 它保留了下一个字符的字面值,但<newline>除外。 如果出现\\<newline>对,并且反斜杠本身不被引用,则将\\<newline>视为行继续(即,它将从输入流中删除并被有效忽略)。

用单引号括起字符可以保留引号中每个字符的字面值。 单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。

用双引号括起字符会保留引号内所有字符的字面值,但$ ,`, \\除外,并且,当启用历史记录扩展时, ! 字符$和`在双引号中保留其特殊含义。 反斜杠只有在跟随以下字符之一时才保留其特殊含义: $ ,`, "\\<newline> 。双引号可以在双引号之前引用,前面加一个反斜杠。如果启用,则历史扩展除非使用反斜杠转义出现在双引号中的! ,否则将执行。 !之前的反斜杠不会被删除。

在双引号中,特殊参数*@具有特殊含义。

$'string'形式的单词是专门处理的。 单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符。

反斜杠转义序列(如果存在)按如下方式解码:

  \\a alert (bell) \\b backspace \\e \\E an escape character \\f form feed \\n new line \\r carriage return \\t horizontal tab \\v vertical tab \\\\ backslash \\' single quote \\" double quote \\nnn the eight-bit character whose value is the octal value nnn (one to three digits) \\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \\UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits) \\cx a control-x character 

扩展结果是单引号,好像美元符号不存在一样。

带有美元符号($“string”)的双引号字符串将导致根据当前语言环境转换字符串。 如果当前区域设置为C或POSIX,则忽略美元符号。 如果翻译并替换字符串,则替换为双引号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM