linux - bash getopts 无法识别参数

标签 linux bash awk getopts

我们有一个 getopts 脚本来检索下面的参数

#!/bin/bash
while getopts ":d:l:f:o:" OPT;
do
    echo 'In Test Script - Got Options '$OPT ' with' $OPTIND ' and ' $OPTARG
    case $OPT in
        d)
            echo $OPTARG;;
        f)
            echo $OPTARG;;
        l)
            echo $OPTARG;;
        ?)
            echo $OPTARG;;
    esac
done

我们收到一个参数,该参数在另一个脚本中解析并传递给 getopts 脚本,它适用于单个条目,例如12345,-d somedesc -l somelabel

#!/bin/bash
INFO="12345,-d somedesc -l somelabel"
ID=`echo "$INFO" | awk -F "," "{ print $"1" }"`
OPTIONS=`echo "$INFO" | awk -F "," "{ print $"2" }"`
sh test.sh $OPTIONS

但是,我们会收到多个条目,例如12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel 并使用 loopawk 进一步拆分参数在这种情况下,即使正确传递了 OPTIONS,也不会触发 getopts

#!/bin/bash
INFO="12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel"
IFS=":"
set $INFO
echo 'Parsing INFO '$INFO
for item
do
    echo 'Item is '$item
    #parsing each item to separate id and options
    ID=`echo "$item" | awk -F "," "{ print $"1" }"`
    echo 'ID is '$ID
    OPTIONS=`echo "$item" | awk -F "," "{ print $"2" }"`
    echo 'Invoking Test Script with '$OPTIONS
    sh test.sh $OPTIONS
done

getopts 无法识别选项的任何原因?

最佳答案

问题是您正在将脚本顶部的 IFS 值更改为冒号 :,然后将参数传递给脚本 test.sh 而 IFS 仍设置为 :。实际上被称为:

第一次:

sh test.sh "-d somedesc -l somelabel"

第二次:

sh test.sh " -d anotherdesc -l anotherlabel"

因此将参数列表变成一个单个参数并且 getops 失败。

您需要做的是在将其设置为冒号之前保存原始 IFS,并在设置命令后恢复它,如下所示:

#!/bin/bash
INFO="12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel"
# save IFS value
OLDIFS=$IFS
IFS=":"
set $INFO
# restore saved IFS value
IFS=$OLDIFS

echo 'Parsing INFO '$INFO
for item
do
    echo 'Item is '$item
    #parsing each item to separate id and options
    ID=`echo "$item" | awk -F "," "{ print $"1" }"`
    echo 'ID is '$ID
    OPTIONS=`echo "$item" | awk -F "," "{ print $"2" }"`
    echo 'Invoking Test Script with '$OPTIONS
    sh test.sh $OPTIONS
done

关于linux - bash getopts 无法识别参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17668204/

相关文章:

sql - 如何将 bash 变量传递到 sql 文件

awk - 在 IPv4 地址匹配后使用 SED 删除冒号到行尾

shell - 使用 POSIX 工具将换行符替换为字符串 '\n'

bash - 如何在 bash 中列出脚本中声明的变量?

linux - bash - 根据过程条件返回值

linux - 随机命令挂起时如何修复 Centos lxc 容器?

python - 如何制作一个始终在 Linux 终端中运行的脚本?

linux - 如何将终端输出中的 'specific' 行保存到文件中?

linux - 使用 AWK 仅显示隐藏的常规文件,不包括目录

linux - 从文件夹中的所有文件中提取 200 行