📜  Linux 中的 getopts 命令示例(1)

📅  最后修改于: 2023-12-03 15:17:21.776000             🧑  作者: Mango

Linux 中的 getopts 命令示例

在 Linux 命令行中,使用 getopts 命令可以方便地对命令行参数进行解析。本文将介绍 getopts 命令的基本用法以及几个示例。

基本用法

getopts 命令的基本用法如下:

while getopts "a:b:" opt; do
  case $opt in
    a)
      arg_a="$OPTARG"
      ;;
    b)
      arg_b="$OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

上面的代码中,while 循环会遍历命令行参数,并使用 getopts 命令解析它们。-a 和 -b 分别表示两个选项,它们后面的冒号表示需要带一个参数。如果命令行中带有非法选项或者缺少参数,getopts 命令会自动报错并退出脚本。

示例 1:解析命令行参数

假设有一个脚本需要从命令行中读取两个参数:一个文件名和一个表示行数的整数。

#!/bin/bash

while getopts "f:n:" opt; do
  case $opt in
    f)
      file="$OPTARG"
      ;;
    n)
      lines="$OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

echo "File: $file"
echo "Lines: $lines"

使用上述脚本时,需要在命令行中提供 -f 和 -n 选项以及它们的参数:

$ ./script.sh -f example.txt -n 10
File: example.txt
Lines: 10
示例 2:提供默认值

如果命令行中没有提供某个选项的参数,可以在脚本中为它提供默认值。例如:

#!/bin/bash

while getopts "f:n:" opt; do
  case $opt in
    f)
      file="$OPTARG"
      ;;
    n)
      lines="$OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

if [ -z "$file" ]; then
  file="example.txt"
fi

if [ -z "$lines" ]; then
  lines=20
fi

echo "File: $file"
echo "Lines: $lines"

上述脚本中,如果命令行中没有提供 -f 选项的参数,则默认使用 example.txt;如果没有提供 -n 选项的参数,则默认使用 20。

示例 3:使用长选项

getopts 命令不支持长选项,但是可以通过一些技巧实现类似的效果。例如,可以在脚本中使用 case 语句判断命令行参数的值:

#!/bin/bash

while [ "$#" -gt 0 ]; do
  case "$1" in
    --file|-f)
      file="$2"
      shift
      ;;
    --lines|-n)
      lines="$2"
      shift
      ;;
    *)
      break
      ;;
  esac
  shift
done

if [ -z "$file" ]; then
  file="example.txt"
fi

if [ -z "$lines" ]; then
  lines=20
fi

echo "File: $file"
echo "Lines: $lines"

上述脚本中,我们使用 case 语句同时判断短选项和长选项,并在选项后面读取其值。如果命令行中没有提供值,则使用默认值。注意,我们在 case 语句中使用了 shift 命令,以便遍历所有的命令行参数。

结论

getopts 命令可以方便地解析命令行参数,是编写脚本和命令行工具的常用技巧之一。在实际使用过程中,如果需要处理更加复杂的命令行参数,可以考虑使用类似 getopt 或者 argparse 的第三方库。