環境変数でシンボルエスケープを防ぐ方法は?

環境変数でシンボルエスケープを防ぐ方法は?

シェルスクリプトを作成しようとしていますが、読みやすくするために、コマンドの一部を環境変数に入れることにしました。

#!/bin/bash
# Variables

name_expression="-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)"

# Commands

find /root/ -maxdepth 1 "$name_expression" -execdir rm -rf {} \;
find /home/ -maxdepth 2 "$name_expression" -execdir rm -rf {} \;

問題は、このシェルを実行しようとすると、多くの記号が引用符で囲まれていることです。

bash -x ./my_shell.sh 
+ name_expression='-type d \( -name .android -o -name .AndroidStudio* -o -name .gradle \)'
+ find /home/ /root/ -maxdepth 2 '-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)' -execdir rm -rf '{}' ';'
find: unknown predicate `-type d \( -name .folder1 -o -name .wildcardfolder* -o -name .folder2 \)'

この変数を変更せずに渡す方法はありますか?

ベストアンサー1

name_expression=( -type d \( -name .folder1 -o -name .wildcardfolder\* -o -name .folder2 \) )

find /root/ -maxdepth 1 "${name_expression[@]}" -execdir rm -rf {} \;

コマンドが複数の部分を表示するには、引用符を解く必要がある文字列パラメータの代わりに配列パラメータを使用します。このように分割と参照を制御できます(完全に制御することはできませんが、つまり部品ごとに制御することはできませんが、作業に適した方法で)。

完全な制御を可能にするもう1つの選択肢はを使用することですが、evalこれによりコマンドラインの残りの部分がより複雑になります。

おすすめ記事