小文字/大文字のファイルまたはディレクトリを生成するスクリプトを生成しようとしています。
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
解析されたすべてのオプションが削除され、パス名"$@"
オペランドのみが位置引数リストに残ります。これがループの後に繰り返されます。
上記のコードは適切なデフォルト値を使用します(これはヘルプテキストに記載する必要があります)。これは、スクリプトの実行にオプションが必要ないことを意味します。参考までにツールを実行してください。いいえどのパラメータでもエラーが発生しない可能性があります。やるべきことがないので、何もしてはいけません。