解释 eval 集——“$ARGS”在 Bash 中与 getopt 的使用

问题描述 投票:0回答:1

我正在编写一个需要参数解析的简单 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"

从我读到的内容来看,这与位置参数的使用有关,但我不明白这一行是否会启用在我的脚本中使用位置参数此外到短/长选项或服务于其他一些功能。我也不明白如何解析这一行中的语法。

我希望对语法进行细分并对该行的实用程序进行整体解释。

bash getopt
1个回答
0
投票

来自

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
解析的下游进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.