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

时间:2017-02-08 06:25:01

标签: linux bash shell quoting

使用以下所需参数调用.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 #####:找不到事件

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

3 个答案:

答案 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)

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

  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
    
  3. 来自man bash

      

    <强> QUOTING

         

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

         

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

         

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

         

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

         

    用单引号括起字符可保留引号中每个字符的字面值。单引号可能不会发生   单引号之间,即使前面有反斜杠。

         

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

         

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

         

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

         

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

    $'string'
         

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

         

    以美元符号开头的双引号字符串($&#34; string&#34;)将导致根据当前语言环境翻译字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换字符串,则替换为双引号。