[ -f /*.txt ]
würde nur dann true zurückgeben, wenn es eine (und nur eine) nicht ausgeblendete Datei gibt, /deren Name auf endet, .txtund wenn diese Datei eine reguläre Datei oder ein Symlink zu einer regulären Datei ist.
Das liegt daran, dass Platzhalter von der Shell erweitert werden, bevor sie an den Befehl übergeben werden (hier [).
Also , wenn es eine ist /a.txtund /b.txt, [wird 5 Argumente übergeben werden: [, -f, /a.txt, /b.txtund ]. [würde mich dann beschweren, dass -fzu viele argumente vorgebracht werden.
Wenn Sie überprüfen möchten, ob das *.txtMuster auf mindestens eine nicht ausgeblendete Datei erweitert wird (regulär oder nicht):
shopt -s nullglob
set -- *.txt
if [ "$#" -gt 0 ]; then
./script "$@" # call script with that list of files.
fi
# Or with bash arrays so you can keep the arguments:
files=( *.txt )
# apply C-style boolean on member count
(( ${#files[@]} )) && ./script "${files[@]}"
shopt -s nullglobist bashspezifisch, aber Muscheln mögen ksh93, zsh, yash, tcshgleichwertige Aussagen.
Beachten Sie, dass diese Dateien beim Lesen des Inhalts des Verzeichnisses gefunden werden. Es wird nicht versucht, auf diese Dateien zuzugreifen. Dies macht es effizienter als Lösungen, die Befehle wie lsoder statin dieser Liste von Dateien aufrufen , die von der Shell berechnet werden.
Das Standardäquivalent shwäre:
set -- [*].txt *.txt
case "$1$2" in
('[*].txt*.txt') ;;
(*) shift; script "$@"
esac
Das Problem ist, dass bei Bourne- oder POSIX-Shells ein Muster, das nicht übereinstimmt, sich selbst erweitert. Wenn also *.txterweitert wird *.txt, wissen Sie nicht, ob es sich um eine .txtDatei handelt, die nicht im Verzeichnis enthalten ist, oder um eine Datei, die aufgerufen wird *.txt. Mit [*].txt *.txtkönnen Sie zwischen beiden unterscheiden.
/? Außerdem fehlt Ihnen zuvor ein Semikolonfi.