无法分析bash脚本中for循环中的选项

无法分析bash脚本中for循环中的选项,bash,for-loop,Bash,For Loop,我编写了一个shell脚本,但无法分析选项。脚本可以获取-t选项或-i选项,这两个选项都需要参数。 这是剧本。环境是Centos6.7 bash版本4.1.2 $ cat opt_test.sh #!/bin/bash ## Analyze options for opt in $* do case ${opt} in '-t' ) opt_t_flag=0 opt_t_value=$2 shift 2 ;; '-i' )

我编写了一个shell脚本,但无法分析选项。脚本可以获取-t选项或-i选项,这两个选项都需要参数。 这是剧本。环境是Centos6.7 bash版本4.1.2

$ cat opt_test.sh
#!/bin/bash

## Analyze options
for opt in $*
do
  case ${opt} in
    '-t' )
      opt_t_flag=0
      opt_t_value=$2
      shift 2
      ;;
    '-i' )
      opt_i_flag=0
      opt_i_value=$2
      shift 2
      ;;
    * )
      echo Usage: ${0##*/} [-t time] [-i ip_address]
      exit 1
      ;;
  esac
done

## Check value
echo opt_t_value: ${opt_t_value}
echo opt_i_value: ${opt_i_value}
我执行了它,但它无法工作

$ ./opt_test.sh -t 1200
Usage: opt_test.sh [-t time] [-i ip_address]

$ ./opt_test.sh -t 1200 -i 127.0.0.1
Usage: opt_test.sh [-t time] [-i ip_address]
我希望第一个结果是
opt\u t\u值:1200\n opt\u值:
,第二个结果是
opt\u t\u值:1200\n opt\u值:127.0.0.1

[问题1] 为什么这个脚本不能工作

[问题2]
我应该修改哪个部分来分析选项?

[回答问题1] 我写了下面的简短脚本并进行了测试

$ cat for_test.sh
#!/bin/bash

for opt in $*
do
  echo opt: ${opt}
  shift 2
  echo '$*': $*
done

$ ./for_test.sh 1 2 3 4 5 6
opt: 1
$*: 3 4 5 6
opt: 2
$*: 5 6
opt: 3
$*:
opt: 4
$*:
opt: 5
$*:
opt: 6
$*:
可能
shift 2
只影响for循环中的“$*”。解决方法是使用
while
循环而不是
for
<代码>而循环看起来工作正常

$ cat while_test.sh
#!/bin/bash

while [ $# -gt 0 ]
do
  opt=$1
  echo opt: ${opt}
  shift 2
  echo '$*': $*
done

$ ./while_test.sh 1 2 3 4 5 6
opt: 1
$*: 3 4 5 6
opt: 3
$*: 5 6
opt: 5
$*:
所以我修改了第一个脚本,如下所示。这是[第二季度的答案]

$ cat cat opt_test.sh
#!/bin/bash

while [ $# -gt 0 ]
do
  opt=$1
  case ${opt} in
    '-t' )
      opt_t_flag=0
      opt_t_value=$2
      shift 2
      ;;
    '-i' )
      opt_i_flag=0
      opt_i_value=$2
      shift 2
      ;;
    * )
      echo Usage: ${0##*/} [-t time] [-i ip_address]
      exit 1
      ;;
  esac
done

echo opt_t_value: ${opt_t_value}
echo opt_i_value: ${opt_i_value}
看起来工作正常。(尽管没有错误处理…)

$ ./opt_test.sh -t 1200 -i 127.0.0.1
opt_t_value: 1200
opt_i_value: 127.0.0.1