Bash:如何在 shift 时使用;do..case $1 in

tes*_*mus 6 bash

我正在处理一个 bash 脚本,我需要实现“选项”。我怎么能用 bash 做到这一点?

我的目标是按以下方式运行脚本: /myscript.sh -d "/var/log/" -c "test"

我试过的:

while shift; do
        case $1 in
                -d)
                        shift&&DIR="$1"||die
                ;;
                -c)
                        shift&&COMMAND="$1"||die
                ;;
        esac
done

echo "$DIR"
echo "$COMMAND"
Run Code Online (Sandbox Code Playgroud)

Nic*_*ton 10

你的错误是你在循环的顶部移动,在你检查它之前抛出第一个参数。这就是我认为你可能的意思:

#!/bin/bash
while (( "$#" )); do
   case $1 in
      -d)
         shift&&DIR="$1"||die
         ;;
      -c)
         shift&&COMMAND="$1"||die
         ;;
   esac
   shift
done

echo "$DIR"
echo "$COMMAND"
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 8

要扩展@choroba 的答案,以下是如何使用的示例getopts

# parse the flag options (and their arguments)
while getopts c:d: OPT; do
    case "$OPT" in
      d)
        DIR="$OPTARG" ;;
      c)
        COMMAND="$OPTARG" ;;
      [?])
        # got invalid option
        echo "Usage: $0 [-d directory] [-c command]" >&2
        exit 1 ;;
    esac
done

# get rid of the just-finished flag arguments
shift $(($OPTIND-1))
Run Code Online (Sandbox Code Playgroud)

请注意,在移出标志参数后,任何“常规”参数都将保留。所以那时你可以处理它们(例如... for arg in "$@"; do ...),或者如果你的脚本不接受它们,如果你得到任何(if [ $# -gt 0 ]; then echo "Usage ...)。