複数のフラグを持つスクリプト

複数のフラグを持つスクリプト

小文字/大文字のファイルまたはディレクトリを生成するスクリプトを生成しようとしています。

 modify [-r] [-l|-u] <dir/file names...>

私は現在フラグをチェックするためにgetoptsを使用しています。ただし、-rlの変更などのコマンドを実行して、私のディレクトリ/ファイルを繰り返し小文字に置き換えることはできません。

(編集済み)コード:

#!/bin/bash

FLAGS=""
if [ $# -eq 0 ]
then
    echo -e "No arguments supplied. \nPlease supply an argument.For more information use -h."
else
  while getopts "rluh" opt
  do
    case $opt in
      r)
        FLAGS+=r
        ;;
      l)
        FLAGS+=l
        ;;
      u)
        FLAGS+=u
        ;;
      h)
        FLAGS+=h
        ;;
      *)
        echo "Unrecognized argument. Please enter -h for information"
    esac
  done

fi
if [[ "$FLAGS" == "l" && "$2" -eq 0 ]]
then
  echo "file to modify $2"
elif [[ "$FLAGS" == "h" && "$2" -eq 0 ]] 
then
  echo "Some info"
fi


exit 0

答え1

有効なオプションごとに個別のフラグを設定すると、特定のオプションが使用されていることを確認するために別の文字列を解析する必要がないため、簡単になります。

たとえば、

#!/bin/bash

self=$0

show_help () {
    cat <<END_HELP
Usage: $self [-r] [-l|-u] pathname [...]

Options:

    info about options here

END_HELP
}

recurse=0    # don't recurse by default
lowercase=1  # lowercase by default

while getopts rluh opt; do
    case $opt in
        r) recurse=1   ;;
        l) lowercase=1 ;;
        u) lowercase=0 ;;
        h) show_help
           exit ;;
        *) echo 'Error in parsing options' >&2
           exit 1
    esac
done

shift "$(( OPTIND - 1 ))"

for pathname do
    if [ -d "$pathname" ] && [ "$recurse" -eq 1 ]; then
        # recurse here
    fi
    if [ "$lowercase" -eq 1 ]; then
        # turn into lowercase
    else
        # turn into uppercase
    fi
done

次のコードはshiftサンプルコードです。再帰ではなくループの使用を検討することをお勧めしますfind(おそらくすべての場合にrecursionフラグがいいえ置く)。

ただし、shift解析されたすべてのオプションが削除され、パス名"$@"オペランドのみが位置引数リストに残ります。これがループの後に繰り返されます。

上記のコードは適切なデフォルト値を使用します(これはヘルプテキストに記載する必要があります)。これは、スクリプトの実行にオプションが必要ないことを意味します。参考までにツールを実行してください。いいえどのパラメータでもエラーが発生しない可能性があります。やるべきことがないので、何もしてはいけません。

答え2

フラグ文字を単一の文字列に連結するので、を使用すると取得するのと同じでmyscript -l -rFLAGS=lrありません。lr

同一性テストの代わりにパターンマッチングを使用してこれを処理できます。

if [[ $FLAGS = *r* ]]; then
    echo "flag -r was given"

または、各フラグに異なる変数を追加します。

r_flag=
l_flag=
while getopts "rluh" opt; do
    case $opt in
        r) r_flag=1;;
...
if [[ $r_flag ]]; then
    echo "flag -r was given"

いずれにせよ、...で処理されたオプションが位置引数から削除され、...に残っているのは、オプションの後に提供されたスクリプト引数になるようにループshift $(( OPTIND - 1 ))後に実行したいと思うかもしれません。while getoptsgetopts$1$2

答え3

これはFLAGS+=rFLAGSにrを追加します。したがって、modify -r -lFLAGSの場合rl。各オプションには1つの変数(FLAG_r)を使用する必要があります。

スクリプトが"$2" -eq 02つのディレクトリ名を取得する場合のみ(2番目の名前はです0。より良い比較はです"$2" = ""。)

関連情報