如何引用bash标志参数来通过一个getopts调用并被第二个getopts调用解释?
Script如何引用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解释 这三个脚本中的任何
nerf
调用Scriptherd
,后者调用Scripter
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”)
和/