Um den Kommentar von Stéphane Chazelas zu Kusalanandas Antwort weiterzuverfolgen:
$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv TABLE2.csv
Verwenden Sie ein Array, um die Dateien zu speichern. Beginnen Sie mit einem Glob-Ausdruck, der einigen Dateien entspricht:
$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)
Jetzt ein "nackter" Glob, der nicht übereinstimmt, um zu demonstrieren, dass ein nicht übereinstimmender Glob durch das Glob-Muster als Zeichenfolge ersetzt wird:
$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')
Jetzt mit dem Präfix "null glob"
$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$
Sehen Sie sich den Abschnitt File Name Generation auf Ihrer ksh-Manpage an.
Um speziell auf Ihre Frage zu antworten:
typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
Sie sollten es sich abgewöhnen, Variablennamen in GROSSBUCHSTABEN zu verwenden.
Siehe auch:https://mywiki.wooledge.org/ParsingLs
Mit 2>/dev/null
können Sie die Fehlermeldung verschwinden lassen innerhalb der ls
.
Sie können dann prüfen, ob $CONTENTS
ist leer mit -z
CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
Um zu erkennen, ob ein Dateinamenmuster zu irgendetwas erweitert wird, können Sie
verwendenset -- "$gp_path"ALLSTUFF*.zip
if [ -e "$1" ]; then
echo matched something
else
echo did not match anything
exit 1
fi
Die set
Der Befehl setzt die Positionsparameter auf die Dateinamen, die mit dem Muster übereinstimmen, und wenn der erste übereinstimmende Dateiname existiert, dann stimmt er mit etwas überein. Das Muster bleibt nicht erweitert, wenn es mit nichts übereinstimmt.
Dies wäre in ksh
verwendbar , bash
und alle anderen sh
-ähnliche Schale.