在bash中解析命令行参数和标志的组合

时间:2019-05-27 14:59:26

标签: bash command-line-arguments

我正在尝试编写bash脚本,该脚本将读取多个文件名和一个目标目录,这是可选的。

./myfile -t /home/users/ file1 file2

我尝试了以下代码,但无法处理以下提到的不同情况:

while getopts "t:" opt; do
  case $opt in
    t)
      echo "-t was triggered, Parameter: $OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG"
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument."
      exit 1
      ;;
  esac
done

但是代码应处理不同的情况,例如: ./myfile file1 file2 -t /home/users/./myfile file1 -t /home/users/ file2 file3./myfile file1 file2 file3 file4 并且应该能够读取文件。

2 个答案:

答案 0 :(得分:0)

在这种情况下,使用while循环到readshift的参数可能会更容易。 在下面的示例中,循环遍历参数以查找字符串-t,在这种情况下,arguments数组被移了一步,现在nr 1索引应该是可选的homedir。在所有其他情况下,该项目将移动到另一个名为files的数组中。

#! /bin/bash

files=()
homedir=
while (( $# > 0 )); do
    case "$1" in
        -t )
            shift
            homedir="$1"
            ;;
        * )
            files+=("$1")
        ;;
    esac
    shift
done
echo "${files[@]}"
echo "$homedir"

答案 1 :(得分:0)

while循环之后,您需要shift删除所有选项及其参数。即使没有任何标志/标志争论,此方法也有效。

shift $(($OPTIND - 1))

然后其余的参数在"$@"中可用,并且可以用任何常用的方式来处理。例如:

for arg in "$@"
do
    something_with "$arg"
done

有关更多信息,请参见我的答案here