bash getopts 无法识别第二个参数
bash getopts not recognizing the second argument
这是我的整个脚本的最简单形式。
#!/bin/bash
src=""
targ=${PWD}
while getopts "s:t:" opt; do
case $opt in
s)
src=$OPTARG
;;
t)
targ=$OPTARG
;;
esac
shift $((OPTIND-1))
done
echo "Source: $src"
echo "Target: $targ"
我运行这个脚本为getopts_test -s a -t b
但是,它总是在 Target:
前面打印 pwd
而从不打印 b
我在这里错过了什么?
从未打印 b
的原因是循环中的 shift
在第一次迭代后将处理过的选项移走,即在打印 a
之后。使用 shift $((OPTIND-1))
旨在访问可能的给定可变参数。自然地,一旦您删除 shift
,targ
就会重新分配给 b
,并且 ${PWD}
不再包含在其中,因为您没有字符串的连接(targ
和 -t
) 的选项。
@glenn-jackman 在他的评论中建议的替代方案
会是这样的:
#!/bin/bash
src=""
targ=${PWD}
while getopts "s:t:" opt; do
case $opt in
s)
src=$OPTARG
echo "Source: $src"
;;
t)
targ=$OPTARG
echo "Target: $targ"
;;
esac
done
shift $((OPTIND-1)) # Turning to non-option arguments say a file name and so on.
在这里,您无需 shift
ing 即可进行自然的论证。
这是我的整个脚本的最简单形式。
#!/bin/bash
src=""
targ=${PWD}
while getopts "s:t:" opt; do
case $opt in
s)
src=$OPTARG
;;
t)
targ=$OPTARG
;;
esac
shift $((OPTIND-1))
done
echo "Source: $src"
echo "Target: $targ"
我运行这个脚本为getopts_test -s a -t b
但是,它总是在 Target:
前面打印 pwd
而从不打印 b
我在这里错过了什么?
从未打印 b
的原因是循环中的 shift
在第一次迭代后将处理过的选项移走,即在打印 a
之后。使用 shift $((OPTIND-1))
旨在访问可能的给定可变参数。自然地,一旦您删除 shift
,targ
就会重新分配给 b
,并且 ${PWD}
不再包含在其中,因为您没有字符串的连接(targ
和 -t
) 的选项。
@glenn-jackman 在他的评论中建议的替代方案 会是这样的:
#!/bin/bash
src=""
targ=${PWD}
while getopts "s:t:" opt; do
case $opt in
s)
src=$OPTARG
echo "Source: $src"
;;
t)
targ=$OPTARG
echo "Target: $targ"
;;
esac
done
shift $((OPTIND-1)) # Turning to non-option arguments say a file name and so on.
在这里,您无需 shift
ing 即可进行自然的论证。