変数にコマンドラインパラメータ文字列を作成し、それを使用してコマンドを実行したいと思います。以下に簡単な例を示します。これは「listfiles」というスクリプトです。ファイルを一覧表示せずに「ignore」というファイルを読み、それ以外のすべてのファイルを一覧表示する必要があります。私がしたいことを達成するための最良の方法は何ですか?
ignorelist=( `cat "./ignore" `)
for LINE in "${ignorelist[@]}"
do
Ignore="$Ignore -path '$LINE' -prune -o ";
done
find ${Ignore} -print
ファイルの内容(ディレクトリ名2つ)を無視します。
./d1
./d2
bash -xリストファイルの出力:
+ ignorelist=(`cat "./ignore" `)
++ cat ./ignore
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o '
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o -path '\''./d2'\'' -prune -o '
+ find -path ''\''./d1'\''' -prune -o -path ''\''./d2'\''' -prune -o -print
.
./1
./2
./3
./d1
./d1/4
./d1/d1a
./d1/d1a/5
./d2
./ignore
./listfiles
d1、d2、および下のすべての内容が出力に含まれないようにするか、無視ファイル内のすべてのファイル/ディレクトリが出力に含まれないようにします。コマンド全体をvarに保存して評価する方が良いですか?
答え1
常に配列を使用して、以下を保存します。分離。ビルドに有効なオプションセットがあることを確認してくださいfind
。パラメーターに追加の引用符を含めないでください。これにより、最終的にコマンドが失敗します。
#!/bin/bash
readarray -t ignorepaths <./ignore
ignoreopts=()
for pathname in "${ignorepaths[@]}"; do
ignoreopts+=( -o -path "$pathname" )
done
find . \( "${ignoreopts[@]:1}" \) -prune -o -print
また、見ることができます
- シェル変数をコマンドオプションとして使用 ...他の人。
のため/bin/sh
:
#!/bin/sh
set --
while IFS= read -r pathname; do
set -- "$@" -o -path "$pathname"
done <./ignore
shift
find . \( "$@" \) -prune -o -print