簡體   English   中英

Bash:檢查是否給出了參數(例如,是否有參數“-a”?)

[英]Bash: Check if argument is given (e.g. is there the argument "-a" ?)

我有一個腳本,它應該接受 2 個參數。 (-s 和 -d)。 如果沒有給出 -d 參數,我想刪除我的調試文件。 與 -s 相同。 如何檢查 $1 或 $2 是 -s 還是 -d?

舒爾有 2 個論據,我可以做到“蠻力”:

if test $1 != "-d" && test $2 != "-d" then
rm $debug
fi

但是如果我有超過 2 個它會變得復雜,那么檢查任何參數是否為 "-d" 的正確方法是什么?

這是為您解析的過度簡化的參數,因此您明白了:

#!/bin/bash

arg_s=0
arg_d=0

show_help() { printf 'Help me\n'; }
show_version() { printf 'version -∞\n'; }
show_usage() { printf 'Usage: %s [-s|-d|-v|-h] [args...]\n' "${0##*/}"; }
invalid_option() { printf >&2 "you can't use option %s. You dumbo\n" "$1"; show_usage; exit 1; }

while (($#)); do
    [[ $1 = -- ]] && { shift; break; }
    [[ $1 = -?* ]] || break
    case $1 in
        (-s) arg_s=1 ;;
        (-d) arg_d=1 ;;
        (-h) show_help; exit 0 ;;
        (-v) show_version; exit 0 ;;
        (-*) invalid_option "$1" ;;
    esac
    shift
done

printf 'You passed the -s flag: %d\n' "$arg_s"
printf 'You passed the -d flag: %d\n' "$arg_d"
printf 'Remaining arguments:\n'
printf '   %s\n' "$@"

請注意,它需要一些額外的工作來處理像-ds這樣的標志,這意味着-d -s 1 ,需要一些額外的工作來讓選項接受參數,以及一些額外的工作來處理長選項。 所有這些都是可行的,沒有任何重大問題。


1你可以看看我的模擬which它有一個支持它的參數解析。

使用getopt(1)解析 shell 腳本中的命令行選項。

您可以按如下方式實現基本循環:

for arg in "$@"; do
    if [ "$arg" = '-d' ]; then
        rm -f $debug
    fi
done

對於更復雜的解析,您應該考慮使用內置命令 getopts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM