我正在编写一个需要参数解析的简单 Bash 脚本,并编写了以下脚本,该脚本使用 getopt 来解析提供给脚本的短或长参数。
#!/bin/bash
# Default values
EXPERIMENT_NAME=""
SW_IMAGE=""
INSTANCE=""
TOTAL_RUNTIME=""
DATASET=""
PRIORITY=""
# Parse command-line options
ARGS=$(getopt -o n:i:s:r:d:p: --long experiment-name:,sw-image:,instance:,total-runtime:,dataset:,priority: -- "$@")
eval set -- "$ARGS"
# Process options and arguments
while true; do
case "$1" in
-n | --experiment-name)
EXPERIMENT_NAME="$2"
shift 2 ;;
-i | --sw-image)
SW_IMAGE="$2"
shift 2 ;;
-s | --instance)
INSTANCE="$2"
shift 2 ;;
-r | --total-runtime)
TOTAL_RUNTIME="$2"
shift 2 ;;
-d | --dataset)
DATASET="$2"
shift 2 ;;
-p | --priority)
PRIORITY="$2"
shift 2 ;;
--)
shift
break ;;
*)
echo "Invalid option: $1"
exit 1 ;;
esac
done
# Display captured values
echo "EXPERIMENT_NAME: $EXPERIMENT_NAME"
echo "SW_IMAGE: $SW_IMAGE"
echo "INSTANCE: $INSTANCE"
echo "TOTAL_RUNTIME: $TOTAL_RUNTIME"
echo "DATASET: $DATASET"
echo "PRIORITY: $PRIORITY"
我从另一个来源逐字删除了以下行,但不明白这一点。
eval set -- "$ARGS"
从我读到的内容来看,这与位置参数的使用有关,但我不明白这一行是否会启用在我的脚本中使用位置参数此外到短/长选项或服务于其他一些功能。我也不明白如何解析这一行中的语法。
我希望对语法进行细分并对该行的实用程序进行整体解释。
来自
set --help
:
-- Assign any remaining arguments to the positional parameters.
If there are no remaining arguments, the positional parameters
are unset.
因此脚本将构造一个由以下内容组成的字符串,我们
eval
uate:
set -- -n 'my_exp' -i 'sushi:1' -s '8gpu' --total-runtime '5d' -- 'any' 'other' 'positional' 'arguments'
我们将迭代(使用
case
语句和 shift 2
)短/长选项以及传递给它们的值,这些值现在被视为位置参数,并且将在以下情况下跳出我们用于解析的迭代循环:我们到达 --
,允许任何其他位置参数(在我的示例中,字面上的参数:any
other
positional
arguments
)在 getopt
解析的下游进行处理。