Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash getopt-shift多个参数_Bash_Shift_Getopt - Fatal编程技术网

Bash getopt-shift多个参数

Bash getopt-shift多个参数,bash,shift,getopt,Bash,Shift,Getopt,我有一个脚本在Ubuntu机器上启动一些检查 我这样调用我的脚本:/script-f/tmp/file.txt--modules 001 002 003 所有文件001、002等。。。是bash脚本 以下主要功能是我的问题: main () { OPTS=`getopt -o hf:m: --long help,file:,modules: -n 'script.sh' -- "$@"` eval set -- "$OPTS" [ $# -eq 0 ] && echo

我有一个脚本在Ubuntu机器上启动一些检查

我这样调用我的脚本:
/script-f/tmp/file.txt--modules 001 002 003

所有文件001、002等。。。是bash脚本

以下主要功能是我的问题:

main () {
OPTS=`getopt -o hf:m: --long help,file:,modules: -n 'script.sh' -- "$@"`

eval set -- "$OPTS"
    [ $# -eq 0 ] && echo "Unknown options or parameters" && USAGE

while [ $# -gt 0 ]; do
    case "$1" in
            -f|--file)
               FILE="$2"
               shift
               ;;
            -h|--help)
               USAGE
               exit 1
               ;;
            -m|--modules)
               MODULES="$2"
               shift
               ;;
    esac
    shift
done

[ -z "$MODULES" ] && echo "No module specified" && USAGE
}
我希望$MODULES变量包含例如
001 002 004

我用shift尝试了不同的方法,但这很复杂

理想情况下,如果我可以使用“$@”作为其余的脚本设置,这将非常棒

编辑:例如,使用
/script.sh-f/tmp/file.txt--modules“001 002 003”
最后$modules变量包含“001 002 003”

但是我有一个for循环,它似乎没有在所有参数上迭代,只在第一个参数上迭代。。。每个
$module
包含“001 002 003”


Getopt无法获取任意数量的值,但您可以将模块列表作为参数usign“传递,稍后解析它:

./script -f /tmp/file.txt --modules "001 002 003"
在脚本中,您可以获得每个单独的值:

for module in $MODULES ; do  
   echo $module
done

它不工作..当我传递命令时,变量
$MODULES
只包含第一个参数..我认为这是由于
MODULES=$2
造成的。您必须设置MODULES=“$2”(使用“包含所有值”)我检查了您的代码,我认为问题是您必须使用“
main”调用main$@“
您需要找出引用变量和不引用变量之间的区别。使用“$MODULES”中的mod的
,您将只进行一次循环迭代。有了“$MODULES”中mod的
,您就可以让shell对变量的值执行(和!),这样就可以在循环中进行多次迭代。我想我需要使用一个列表(而不是一个变量),但我不知道如何在我的̀case`循环中创建一个列表;模块=(2美元);set+f--set命令可关闭/打开文件名扩展。最后,我在“${MODULES[*]}”中为模块调用了
。我需要删除
字符。不,不要这样做:对“${MODULES[@]}”中的模块使用
--保留引号,但使用
@
--请参阅
for module in $MODULES ; do  
   echo $module
done