このリンク:引用符内のワイルドカード文字
私の場合、問題は解決されませんでした。
「a.sh」ファイルには以下が含まれます。
file="path with wildcard*"
"b.sh"ファイルには次のものが含まれます。
. a.sh
[ -f "$file" ] && echo ok
なぜなら
"$file"
ワイルドカード文字を拡張しませんが、代わりに
$file
ワイルドカードを拡張しましたが、エラーが発生しました:「バイナリ演算子が必要です」
このジレンマをどのように解決しますか?二重引用符からワイルドカード文字を抽出することはできません。
編集:
ワイルドカードを介して単一の一致を達成したいと思います。一致するものがあれば、条件はfalseを返し、とにかくエラーを返す必要があります。
ベストアンサー1
に保管したい場合大量にglobパターン拡張で作成されたファイルのリストは、次の変数に保存されますbash
。
pattern='path with wildcard*'
IFS= # disable splitting
shopt -s nullglob # make globs that don't match any file expand to nothing
# instead of the unexpanded pattern.
files=($pattern) # here using split+glob (unquoted expansion in list context)
# with the splitting disabled above.
または、スカラー変数を$files
使用せずに配列を直接割り当てます。$pattern
shopt -s nullglob # make globs that don't match any file expand to nothing
# instead of the unexpanded pattern.
files=('path with wildcard'*)
その後、次を使用してリストが空であることをテストできます。
if [ "${#files[@]}" -gt 0 ]; then
echo it did find some files
fi
これらのファイルの1つ以上が通常のファイルであることを確認するには(シンボリックリンクを確認した後)、次の手順を実行できます。
has_regular_files() {
local file
for file do
[ -f "$file" ] && return
done
false
}
if has_regular_files "${files[@]}"; then
echo there was at least one regular file in the list
fi
1つのファイルにのみ一致し、そのファイルが通常のファイルであることを確認するには、次の手順を実行します。
if [ "${#files[@]}" -eq 1 ] && [ -f "${files[0]}" ]; then
echo one and only one file matches and it is regular.
fi
1 つ以上の一般ファイルと一致し、一致するすべてのファイルが一般ファイルであることを確認するには、次の手順を実行します。
only_regular_files() {
[ "$#" -gt 0 ] || return
local file
for file do
[ -f "$file" ] || return
done
}
if only_regular_files "${files[@]}"; then
echo at least one regular file and all are regular.
fi
シェルでは、zsh
glob修飾子を使用してファイル形式で一致させることができます。
if ()(($#)) $~pattern(N-.); then
print at least one regular file in the expansion of the pattern.
fi
- 対照的に
bash
、zsh
引用符のない引数拡張では暗黙の分割+globは実行されません。ここではワイルドカードを要求します(分割ではありません)$~pattern
。 - globがファイルと一致しない場合はテストできないように拡張するように
(N-.)
glob修飾子を追加します。N
nullglob
.
定期的な-
テストを完了するには、ファイルのみ(他の種類のファイルを除く)後ろにSymlinkの確認により、シンボリックリンクであるファイルを通常のファイルと一致させます(予想通り[ -f "$file" ]
)。 - globの拡張は匿名関数に引数として渡されます。
() {body} args
ここで{body}
isです。(($#))
((expr))
式がゼロ以外の数値で評価された場合はtrueを返すkshスタイルの算術式評価演算子です。ここで、式は$#
位置引数の数に拡張される特別なパラメータです。この場合、この glob 拡張で生成されたファイル数である匿名関数の位置引数の数です。