シェルスクリプトを作成しようとしていますが、読みやすくするために、コマンドの一部を環境変数に入れることにしました。
#!/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
これによりコマンドラインの残りの部分がより複雑になります。