вы можете либо создать один сценарий для каждого поддерживаемого вами дистрибутива, либо, если вы хотите предложить только один сценарий для всех, вам нужно будет определить версию ОС в вашем сценарии, чтобы затем выбрать, хотите ли вы запускать apt, yum или другой
Вы можете составить строку со всеми возможными комбинациями:
all=:
for thing in *test[0-9].txt work-.*; do
all=$all$thing:
done
if [[ "$all" == *:"$file":* ]]; then
# it is in the list
if test "$file" != "test[0-9].txt" -o "$file" != "work-.*"
Утилита test
не выполняет сопоставление с образцом. Для этого вам понадобится конструкция Ksh/Bash/Zsh [[ ]]
(и, по крайней мере, в Bash шаблон не должен заключаться в кавычки ). Так:
for file in *; do
if [[ "$file" != test[0-9].txt && "$file" != work-.* ]]; then
echo "$file"
fi
done
напечатает hello.txt
, если он существует, но не test1.txt
или work-.foo
.
Обратите внимание, что вам нужны и вместо или , так как (x ≠ a или x ≠ b )будет соответствовать любому x.
См.:
В строгом POSIX sh вам нужно будет использовать case
для сопоставления с шаблоном:
for file in *; do
case $file in
test[0-9].txt|work-.*) false;;
*) echo "$file";;
esac
done
Обратите внимание: если вы хотите сопоставить несколько цифр после test
, как в test123.txt
, вам потребуются расширенные подстановочные знаки в стиле ksh иtest+([0-9]).txt
(и shopt -s extglob
в Bash, чтобы они работали во всех контекстах ). Хотя, как отмечает Кусалананда, если вы идете этим путем, вы можете:
for file in !(test[0-9].txt|work-.*); do
echo "$file"
done