我们有一个 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
并使用 loop
和 awk
进一步拆分参数在这种情况下,即使正确传递了 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/