如何引用bash标志参数来通过一个getopts调用并被第二个getopts调用解释?

如何引用bash标志参数来通过一个getopts调用并被第二个getopts调用解释?,bash,shell,getopts,variable-expansion,delayedvariableexpansion,Bash,Shell,Getopts,Variable Expansion,Delayedvariableexpansion,Scriptnerf调用Scriptherd,后者调用Scripternerf在herd上使用一个标志,它显式地接受需要传递给er的参数 在nerf出现之前,这不是一个问题-当刚刚从命令行调用herd时,我们可以单引用-p标志的参数,它们永远不会由herd的getopts解释,而是由er的getopts解释 但是现在我们已经在标志中生成了值,这些值最终需要转到er,因此我需要在nerf中展开变量$file\u contents,但在到达er之前,不要让它们被getopts解释 这三个脚本中的任何

Script
nerf
调用Script
herd
,后者调用Script
er
nerf
herd
上使用一个标志,它显式地接受需要传递给
er
的参数

nerf
出现之前,这不是一个问题-当刚刚从命令行调用
herd
时,我们可以单引用-p标志的参数,它们永远不会由
herd
getopts
解释,而是由
er
getopts
解释

但是现在我们已经在标志中生成了值,这些值最终需要转到
er
,因此我需要在
nerf
中展开变量
$file\u contents
,但在到达
er
之前,不要让它们被
getopts
解释

这三个脚本中的任何一个都可以修改

$ cat nerf
#!/bin/bash
file_contents="`cat one_liner_file`"
er_args="-jkl -m $file_contents"
./herd -p "$er_args"              # <-- the problem


$ cat herd
#!/bin/bash
passthru_args=""
while getopts "p:a:b:cde" opt
do
  case $opt in
    p) passthru_args="$OPTARGS" ;;
    ...
  esac
done
./er "$passthru_args"


$ cat er
#!/bin/bash
while getopts "jklm:" opt
do
  case $opt in
    ...
  esac
done
$cat nerf
#!/bin/bash
file_contents=“`cat one_liner_file`”
er_args=“-jkl-m$文件内容”

./herd-p“$er_args”#许多工具所做的是当传递
-p“-jkl-m something”
时,它们使用伪shell语法拆分字符串。这是一个坏主意,因为它使空间和报价处理变得不可预测

相反,更好的方法是有一种将单个单词传递给命令的方法。这就是
find-exec
所做的——在
-exec
之后直到
+
之前的所有参数按字面意思作为单独的参数传递

下面是一个具有相同语义的
群体
的简单示例:

#!/bin/bash
passthru_args=()
while getopts "pa:b:cde" opt
do
  case $opt in
    p)
      while [[ ${!OPTIND} != ';' ]]
      do
        passthru_args+=("${!OPTIND}")
        let OPTIND++
      done
      let OPTIND++
    ;;
    *) echo "herd: $opt is $OPTARG"
    ;;
  esac
done
./er "${passthru_args[@]}"
您现在可以运行
/herd-p-jkl-m“somestuff”\-一个foo


这将在没有任何空间问题的情况下安全地运行
/er-jkl-m“some stuff”
(但是您很难嵌套使用
作为参数终止符的多个调用)

许多工具所做的是当传递
-p“-jkl-m something”
时,它们使用伪shell语法拆分字符串。这是一个坏主意,因为它使空间和报价处理变得不可预测

相反,更好的方法是有一种将单个单词传递给命令的方法。这就是
find-exec
所做的——在
-exec
之后直到
+
之前的所有参数按字面意思作为单独的参数传递

下面是一个具有相同语义的
群体
的简单示例:

#!/bin/bash
passthru_args=()
while getopts "pa:b:cde" opt
do
  case $opt in
    p)
      while [[ ${!OPTIND} != ';' ]]
      do
        passthru_args+=("${!OPTIND}")
        let OPTIND++
      done
      let OPTIND++
    ;;
    *) echo "herd: $opt is $OPTARG"
    ;;
  esac
done
./er "${passthru_args[@]}"
您现在可以运行
/herd-p-jkl-m“somestuff”\-一个foo


这将在没有任何空间问题的情况下安全地运行
/er-jkl-m“some stuff”
(但是您很难嵌套使用
作为参数终止符的多个调用)

许多工具所做的是当传递
-p“-jkl-m something”
时,它们使用伪shell语法拆分字符串。这是一个坏主意,因为它使空间和报价处理变得不可预测

相反,更好的方法是有一种将单个单词传递给命令的方法。这就是
find-exec
所做的——在
-exec
之后直到
+
之前的所有参数按字面意思作为单独的参数传递

下面是一个具有相同语义的
群体
的简单示例:

#!/bin/bash
passthru_args=()
while getopts "pa:b:cde" opt
do
  case $opt in
    p)
      while [[ ${!OPTIND} != ';' ]]
      do
        passthru_args+=("${!OPTIND}")
        let OPTIND++
      done
      let OPTIND++
    ;;
    *) echo "herd: $opt is $OPTARG"
    ;;
  esac
done
./er "${passthru_args[@]}"
您现在可以运行
/herd-p-jkl-m“somestuff”\-一个foo


这将在没有任何空间问题的情况下安全地运行
/er-jkl-m“some stuff”
(但是您很难嵌套使用
作为参数终止符的多个调用)

许多工具所做的是当传递
-p“-jkl-m something”
时,它们使用伪shell语法拆分字符串。这是一个坏主意,因为它使空间和报价处理变得不可预测

相反,更好的方法是有一种将单个单词传递给命令的方法。这就是
find-exec
所做的——在
-exec
之后直到
+
之前的所有参数按字面意思作为单独的参数传递

下面是一个具有相同语义的
群体
的简单示例:

#!/bin/bash
passthru_args=()
while getopts "pa:b:cde" opt
do
  case $opt in
    p)
      while [[ ${!OPTIND} != ';' ]]
      do
        passthru_args+=("${!OPTIND}")
        let OPTIND++
      done
      let OPTIND++
    ;;
    *) echo "herd: $opt is $OPTARG"
    ;;
  esac
done
./er "${passthru_args[@]}"
您现在可以运行
/herd-p-jkl-m“somestuff”\-一个foo


这将在没有任何空间问题的情况下安全地运行
/er-jkl-m“some stuff”
(但是您很难嵌套使用
作为参数终止符的多个调用)

考虑一个Bash数组:
passthru_args=()
<代码>通过参数+=(“$OPTARGS”)
;和
/er“${passthru_args[@]}”
。当然,你也可以在
nerf
中使用数组:
er_args=(“-p”“-jkl”“-p”“-m”“-p”“-file_contents”)
/herd-p“${er_args[@]}
。您可能应该使用<代码> $(…)<代码>代替代码> >文件内容> =“CAT ONEL LIN文件”< /代码>。考虑BASH数组:<代码> PASTROUXARG=())/>代码>;代码>通过参数+=(“$OPTARGS”)
;和
/er“${passthru_args[@]}”
。当然,你也可以在
nerf
中使用数组:
er_args=(“-p”“-jkl”“-p”“-m”“-p”“-file_contents”)
/herd-p“${er_args[@]}
。您可能应该使用<代码> $(…)<代码>代替代码> >文件内容> =“CAT ONEL LIN文件”< /代码>。考虑BASH数组:<代码> PASTROUXARG=())/>代码>;代码>通过参数+=(“$OPTARGS”)
;和
/er“${passthru_args[@]}”
。当然,你也可以在
nerf
中使用数组:
er_args=(“-p”“-jkl”“-p”“-m”“-p”“-file_contents”)
/herd-p“${er_args[@]}
。您可能应该使用<代码> $(…)<代码>代替代码> >文件内容> =“CAT ONEL LIN文件”< /代码>。考虑BASH数组:<代码> PASTROUXARG=())/>代码>;代码>通过参数+=(“$OPTARGS”)
;和
/er“${passthru_args[@]}”
。当然,您还可以在
nerf
中使用数组:
er_args=(“-p”“-jkl”“-p”“-m”“-p”“$file_contents”)
/