Per seguire il commento di Stéphane Chazelas alla risposta di Kusalananda:
$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv TABLE2.csv
Utilizzare un array per contenere i file. Inizia con un'espressione glob che corrisponda ad alcuni file:
$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)
Ora un glob "nudo" che non corrisponde per dimostrare che un glob non corrispondente viene sostituito dal modello glob come una stringa:
$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')
Ora con il prefisso "null glob"
$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$
Vedi la sezione Generazione del nome del file della tua pagina man di ksh.
Per rispondere specificamente alla tua domanda:
typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
Dovresti prendere l'abitudine di usare nomi di variabili TUTTO MAIUSCOLO.
Vedi anche:https://mywiki.wooledge.org/ParsingLs
Puoi far sparire il messaggio di errore con 2>/dev/null
all'interno del ls
.
Puoi quindi verificare se $CONTENTS
è vuoto con -z
CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
print 'EMPTY'
exit 0
else
print 'NOT EMPTY'
fi
Per rilevare se un modello di nome file si espande in qualsiasi cosa, puoi usare
set -- "$gp_path"ALLSTUFF*.zip
if [ -e "$1" ]; then
echo matched something
else
echo did not match anything
exit 1
fi
Il set
Il comando imposta i parametri posizionali sui nomi file corrispondenti al modello e, se esiste il primo nome file corrispondente, corrisponde a qualcosa. Il pattern rimane non espanso se non corrisponde a nulla.
Questo sarebbe utilizzabile in ksh
, bash
e qualsiasi altro sh
-like shell.