ユーザーに入力を要求してから find コマンドを実行するスクリプトを作成しています。
私が持っているのはうまくいきますが、if / else構造のために重複したコードがたくさんあるように感じます。インラインドアを使用できますかif
?
したがって、次のようなものの代わりに:
if [[ $depth_boolean == y ]] || [[ $depth_boolean == yes ]]
then
if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
then
find -L $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
else
find $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
fi
else
if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
then
find -L $location -readable -iname "$query" -$find_type $find_type_option -$find_action
else
find $location -readable -iname "$query" -$find_type $find_type_option -$find_action
fi
fi
これは可能ですか?
find if [ $symlink_boolean == y ]; then echo "-L";
fi $location if [ $symlink_boolean == y ]; then
echo "-maxdepth $depth"; fi -readable -iname "$query"
-$find_type $find_type_option -$find_action
上記の方法ではできませんが、可能かどうかを知りたいです。
答え1
単純な変数を使用してシンボリックリンクを処理できます。
symlink_flag=
if [[ $symlink_boolean == y ]]; then
symlink_flag=-L
fi
find $symlink_flag "$location" -maxdepth "$depth" -readable ...
これには引用符がないので、$symlink_flag
空の場合は消えます。その値にはワイルドカードやデフォルトIFS
文字が含まれていないため、引用しなくても何の害もありません。たとえば、場所にスペースを含めることができるため、他の変数は引用符で囲む必要があります。
詳細な部分の場合、最良のオプションは配列にコマンドラインを作成することです。
arguments=()
if [[ $symlink_boolean == y ]]; then
arguments+=(-L)
fi
arguments+=("$location")
if [[ $depth_boolean == y ]]; then
arguments+=(-maxdepth "$depth")
fi
find "${arguments[@]}" -readable -iname ...
上記のように変更されていないオプションをfind
コマンドラインに入れることも、無条件配列に追加して実行することもできますfind "${arguments[@]}"
。
また見なさい:
技術的には、コマンドの置き換えによって提案されたタスクを実行することもできます。
find $(if [[ $symlink_boolean == y ]]; then printf %s -L; fi) "$location"
$(if [[ $depth_boolean == y ]]; then echo -maxdepth $maxdepth; fi) ...
これは一般的に最適ではありませんが、コマンド置換で複数の単語を生成する唯一の方法は、スペースで区切って分割することです。ただし、スペースを含める必要がある単語がある場合、この方法も正しく機能しません。しかし、動作するはずです。-maxdepth N
たとえば、[[ $symlink_boolean == [Yy]* ]]
次のように条件を少し圧縮できます。変数がY
aまたはaで始まることを確認してくださいy
。 (実際の値などを気にしない場合YEAAHHH
)正規表現を使用して、2つの値のみを一致または[[ $symlink_boolean =~ ^(y|yes)$ ]]
許可します。case $symlink_boolean in y|yes) echo "true";; esac