📅  最后修改于: 2023-12-03 15:17:21.776000             🧑  作者: Mango
在 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 命令会自动报错并退出脚本。
假设有一个脚本需要从命令行中读取两个参数:一个文件名和一个表示行数的整数。
#!/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
如果命令行中没有提供某个选项的参数,可以在脚本中为它提供默认值。例如:
#!/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。
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 的第三方库。