传递 bash 带有前导连字符的值

passing bash a value with leading hyphen

我有一个 bash 命令,它需要在“-v”之后有一个字符串值。当这个字符串值有一个前导“-”时,bash 试图将它解释为 bash 命令的一个新选项,而不是我试图为 -v 提供的值。有什么办法可以避开这个前导连字符吗?我试过 -v -- -myValue 但它告诉我 "option '-v' needs a parameter."

该命令正在调用 ruby 文件。对于这个问题,我认为这是 ruby 代码中有意义的部分:

opts = Trollop::options do
  opt :method, "Encrypt or Decrypt", :short => "m", :type => :string, :default => "decrypt"
  opt :value, "Value to Decrypt or Encrypt", :short  => "v", :type => :string, :default => ""
end
cmd -v '-string value with leading dash'

编辑

$ cat ~/tmp/test.sh
 #!/bin/bash
 str=
 while getopts "v:" opt; do
 case "$opt" in
    v) str=$OPTARG;;
 esac
 done
 shift $(( OPTIND -1 ))

 echo "option was '$str'"

简单的测试文件,我的bash是GNU bash,版本4.3.11(1)-release (x86_64-pc-linux-gnu)

结果:

chris@druidstudio:~⟫ ~/tmp/test.sh -v string
  option was 'string'
chris@druidstudio:~⟫ ~/tmp/test.sh -v -string
  option was '-string'
chris@druidstudio:~⟫ ~/tmp/test.sh -v '-string'
  option was '-string'

所以,也许处理您的选项的 bash 脚本编写不正确,或者您使用的是 bash 的早期版本。正如我之前在另一个愚蠢的问题中回答的那样,千里眼不是我的技能之一。所以,做个好人,并可能给我们,你正在寻求帮助的人,相关信息(正如你所说,你的脚本在 bash 级别失败,而不是 ruby 级别,那么为什么还要 post 一个 ruby 脚本呢?)

有两种指定参数的常规方法,但这些方法并未在 shell 级别强制执行,它们只是传统方法:

-v xxxx
--value=xxxx

现在有时可以做到:

-vxxxx

如果您有一个带破折号的值并且没有被正确解释,请执行以下操作:

--value=-value