Вот сценарий для проверки моих шаблонов
Я знаю, что этот синтаксис /tmp/**
не bash, это просто настраиваемые параметры, которые будут оцениваться позже и поэтому заключены в одинарные кавычки, чтобы предотвратить bash расширение.
Каждый раз, когда последний тест терпит неудачу и интерпретируется как file
, а не custom
Я не могу перевести это if string contains wildcard character somewhere in the string AND if not ending with * OR /
, это file
#! /usr/bin/env bash
#set -f # => nullglob
shopt -s extglob
testcheck_params=()
testcheck_vals=()
testcheck_params+=('/tmp/file')
testcheck_vals+=("file")
testcheck_params+=('/tmp/file.tmp')
testcheck_vals+=("file")
testcheck_params+=('/tmp/folder/')
testcheck_vals+=("folder")
testcheck_params+=('/tmp/folder/*')
testcheck_vals+=("all files & folders")
testcheck_params+=('/tmp/folder/**')
testcheck_vals+=("all files no folder")
testcheck_params+=('/tmp/folder/*/')
testcheck_vals+=("all folders no file")
testcheck_params+=('/tmp/folder/**/*')
testcheck_vals+=("all files recursive")
testcheck_params+=('/tmp/folder/f*')
testcheck_vals+=("custom")
testcheck_params+=('/tmp/folder/*d*')
testcheck_vals+=("custom")
## This one is failing interpreted as file and not custom
testcheck_params+=('/tmp/folder/*.tmp')
testcheck_vals+=("custom")
for ((i=0 ; i<${#testcheck_params[@]}; i++))
do
echo "[ param: ${testcheck_params[$i]} ]"
testcheck_param="${testcheck_params[$i]}"
#case "$1" in
case "$testcheck_param" in
*[!\*]*[!/\*$]) #*[!/\*$]|
testcheck_val="file"
echo "file"
;;
*[!/][!\*][/$]) # => "/tmp/"
testcheck_val="folder"
echo "folder"
;;
*[!/\*][/][\*$]) # => "/tmp/*"
testcheck_val="all files & folders"
echo "all files & folders"
;;
*[!/\*][/][\*][\*$]) # => "/tmp/**"
testcheck_val="all files no folder"
echo "all files no folder"
;;
*[/][\*][/$]) # => "/tmp/*/"
testcheck_val="all folders no file"
echo "all folders no file"
;;
*[/][\*][\*][/][\*$]) # => "/tmp/**/*"
testcheck_val="all files recursive"
echo "all files recursive"
;;
*)
testcheck_val="custom"
echo "custom"
;;
esac
if [[ "${testcheck_vals[$i]}" == "${testcheck_val}" ]] ; then
echo "TEST = PASSED"
else
echo "TEST = FAILED"
fi
done
exit
Мне нужно сделать это с помощью оператора case, потому что он будет интегрирован в другой сценарий, основанный на нем.
Я прочитал несколько примеров по stackoverflow (но там нет примера, который явно отрицает символ) и Bash Справочное руководство но есть кое-что, что я не могу понять.
С уважением