我不确定下面的脚本出了什么问题,即使我删除了空格,但我仍然遇到错误“[:参数太多”
oldPlugin="/old/plugins/"
cd "$oldPlugin" || true
for FILE in *; do
if [ "$FILE" == "csharp-plugin"* ] || [ "$FILE" == "flex-plugin"* ] || [ "$FILE" == "go-plugin"* ] || [ "$FILE" == "html-plugin"* ] || [ "$FILE" == "iac-plugin"* ] || [ "$FILE" == "jacoco-plugin"* ] || [ "$FILE" == "java-plugin"* ] || [ "$FILE" == "javascript-plugin"* ] || [ "$FILE" == "kotlin-plugin"* ] || [ "$FILE" == "php-plugin"* ] || [ "$FILE" == "python-plugin"* ] || [ "$FILE" == "ruby-plugin"* ] || [ "$FILE" == "scala-plugin"* ] || [ "$FILE" == "vbnet-plugin"* ] || [ "$FILE" == "xml-plugin"* ]; then
rm -rf "$extensionPlugin"/"$FILE"
fi
done
如果我对指定的文件执行 rm -rf ,它会删除它,但是当我添加 if 条件时,它会给我错误,而且如果我在 if 条件下保留 5 或 6 个文件名,它会起作用,但如果我保留的文件名超过这个数量,它会给我错误,
我需要短路 if 条件还是需要其他条件,请帮忙
问候
答案1
有Korn shell 的[[ var = pattern ]]
or[[ var == pattern ]]
运算符(现在其他一些 shell 也支持,但不是标准sh
语法的一部分),还有[
支持=
字符串相等比较运算符的命令。
某些[
实现==
也支持运算符,但这只是=
字符串相等的别名,而不是模式匹配。某些[
实现(例如[
内置的yash
或zsh
支持用于正则表达式匹配的运算符),但同样,这在标准+ 实用程序语法=~
中不可用。sh
[
只是一个普通的命令,
[ "$FILE" == "csharp-plugin"* ]
解释为相同:
echo "$FILE" == "csharp-plugin"* ]
或任何简单的命令,并由shell通过称为的机制"csharp-plugin"*
扩展到当前目录中的文件名列表csharp-plugin
通配或者文件名生成或者路径名扩展并将它们作为单独的参数传递给[
.
因此,如果当前目录包含csharp-plugin1
和csharp-plugin2
,[
将使用[
, csharp-plugin1
, ==
, csharp-plugin1
,csharp-plugin2
和]
作为参数调用,并抱怨csharp-plugin2
它无法理解的额外参数。
模式匹配sh
是通过构造完成的case
。
oldPlugin="/old/plugins/"
cd -- "$oldPlugin" || exit
for FILE in *; do
case "$FILE" in
(csharp-plugin* | flex-plugin* | go-plugin* |...)
rm -rf -- "$extensionPlugin"/"$FILE";;
esac
done
如果您想使用if
, 构造,您可以定义一个辅助函数,例如:
match()
case $1 in
($2) true;;
(*) false;;
esac
并将其用作:
if match "$FILE" 'csharp-plugin*' || match...; then
...
fi
在 Korn shell 中,或者使用 bash shell 和 after shopt -s extglob
(在最新版本的 中不需要bash
)或使用 zsh 和 after set -o kshglob
),您还可以执行以下操作:
if [[ $FILE = @(csharp|flex|go|...)-plugin* ]]; then...
在zsh
, without中kshglob
,简单地进行交替:
if [[ $FILE = (csharp|flex|go|...)-plugin* ]]; then...
在 中sh
,您可以使用以下方法进行简化:
oldPlugin="/old/plugins/"
cd -- "$oldPlugin" || exit
for FILE in *-plugin*; do
case "${FILE%%-plugin*}" in
(csharp | flex | go |...)
rm -rf -- "$extensionPlugin"/"$FILE";;
esac
done