bashスクリプトのfindコマンドで変数とif / elseを組み合わせる

bashスクリプトのfindコマンドで変数とif / elseを組み合わせる

ユーザーに入力を要求してから 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]* ]]次のように条件を少し圧縮できます。変数がYaまたはaで始まることを確認してくださいy。 (実際の値などを気にしない場合YEAAHHH)正規表現を使用して、2つの値のみを一致または[[ $symlink_boolean =~ ^(y|yes)$ ]]許可します。case $symlink_boolean in y|yes) echo "true";; esac

関連情報