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

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

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

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

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

おすすめ記事