小文字/大文字のファイルまたはディレクトリを生成するスクリプトを生成しようとしています。
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 -r
はFLAGS=lr
ありません。l
r
同一性テストの代わりにパターンマッチングを使用してこれを処理できます。
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 getopts
getopts
$1
$2
答え3
これはFLAGS+=r
FLAGSにrを追加します。したがって、modify -r -l
FLAGSの場合rl
。各オプションには1つの変数(FLAG_r
)を使用する必要があります。
スクリプトが"$2" -eq 0
2つのディレクトリ名を取得する場合のみ(2番目の名前はです0
。より良い比較はです"$2" = ""
。)