論理分岐に関するいくつかの指示をスクリプトに渡します。

論理分岐に関するいくつかの指示をスクリプトに渡します。

パラメータに基づいて分岐したいスクリプトがあります。
デフォルトでは、このパラメータはブール値と同じです。しかし、私はユーザーがシェル実行コマンドにゴミを入力し、それをtrueと解釈したくありません。
または、大文字と小文字の区別の問題などを考慮する必要がある文字列がいくつかありません。
私が望む最終結果は次のとおりです。

some_script.sh arg1 arg2 arg3 --remove   

する:

PARAM1="$1"  
PARAM2="$2"  
PARAM3="$3"   
REMOVE=?--> what here   

if [ $REMOVE ]; then  
# remove some files  
fi   

答え1

文字列が--removeスクリプトの位置パラメータにあることを確認するだけです。正規表現一致演算子を使用したbashバージョン=~

#!/bin/bash

if [[ $@ =~ --remove ]]; then
   echo "removing files"
fi

exit

POSIXバージョン:

#!/bin/sh

for arg in "$@"; do
   if [ "$arg" = "--remove" ]; then
      echo "removing files"
   fi
done

exit

答え2

$1友達は固定パラメータセットを持つスクリプトでは比較的うまく機能しますが、動的パラメータを持つスクリプトでは実際にはうまく機能しません。これを行うには、ループとケース構成を使用する必要があります。

REMOVE=
for arg in "$@"; do
    case "$arg" in
        --remove)
            REMOVE=1
            ;;
        *)
            if [ ! -z "$REMOVE" ]; then
                # whatever you need to do to remove
            else
                # whatever you need to do if you do not want to remove
            fi
            ;;
    esac
done

--remove がその後の引数にのみ適用されると記録するとうまくいきます。これにより、削除は一部の引数にのみ適用され、他の引数には適用されないハイブリッドコマンドラインを持つことができます。

script.sh arg1 arg2 --remove arg3

上記の例では、--removearg3では機能しますが、arg1またはarg2では機能しません。--noremoveケース構造にコマンドラインオプションのサポートを追加することもできます。

case "$arg" in
    --noremove)
        REMOVE=
        ;;
    --remove)
        # ... rest of the case remains as is from before
esac

これにより、次のことが可能になります。

script.sh --remove arg1 --noremove arg2 --remove arg3

この例では、--removeオプションはarg1とarg3には適用されますが、arg2には適用されません。

--remove最後に、コマンドラインに表示される場所に関係なく、すべての引数に適用したい場合は、おそらく最も簡単な方法は次のようにしますgetopt(1)

# reorder the command line so that option arguments come first
# and non-option arguments come second, separated by "--"
PARSED=$(getopt -o '' --long remove -n scriptname.sh -- "$@")
# overwrite $@ with the contents of the newly created $PARSED
# Note the quotes; they are essential
eval set -- "$PARSED"

REMOVE=

while true; do
    case "$1" in
        --remove)
            REMOVE=1
            shift
            ;;
        --)
            shift; break;
    esac
done

for arg in "$@"; do
    if [ ! -z "$REMOVE" ]; then
        # whatever you need to do to remove
    else
        # the other thing
    fi
done

引数は-o短いオプションを取るので、必要に応じてそのオプションを代わりにgetopt使用できます-r--removeGetoptには、オプション(オプション)にパラメータなどが含まれることを望むいくつかの追加オプションがあり、ユーザーがスクリプトが認識しないオプションを提供するときに無料のデフォルトの使用法出力を許可します。 GNU getoptには、Debian(およびその派生物)のすべての可能性を示す例があります。/usr/share/doc/util-linux/getopt-parse.bash

関連情報