使用以下所需参数调用.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 #####:找不到事件
我认为特殊字符限制命令执行。然后我如何传递特殊字符。任何帮助都会很明显。
答案 0 :(得分:6)
更改行
dbPassword=exam!ple#####
要,
dbPassword='exam!ple#####'
以避免在!
bash
(历史记录扩展)
来自man bash
子部分下的QUOTING
,
当使用命令历史记录扩展功能时(参见下面的HISTORY EXPANSION),必须引用历史记录扩展字符(通常为!)以防止历史记录扩展。
更多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
的每个字符视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词
答案 1 :(得分:3)
像这样传递:
exam\!ple\#\#\#\#\#
测试:
echo exam\!ple\#\#\#\#\#
答案 2 :(得分:2)
您可以执行以下两项操作:
使用反斜杠
逃避每个特殊符号sh home/example.sh --context_param dbUserName=username --context_param dbPassword=exam\!ple\#\#\#\#\# --context_param resultDate=2017-01-13
单引出整个论点。
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>
。双引号可以在双引号内引用,前面加一个反斜杠。如果启用,则将执行历史记录扩展,除非!
出现在double中 引号使用反斜杠进行转义。 <{1}}之前的反斜杠不会被删除。特殊参数
!
和*
在双引号中具有特殊含义。
@
形式的单词是专门处理的。单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:
$'string'
展开的结果是单引号,好像美元符号不存在一样。
以美元符号开头的双引号字符串($&#34; string&#34;)将导致根据当前语言环境翻译字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换字符串,则替换为双引号。