아래 스크립트에 무슨 문제가 있는지 잘 모르겠습니다. 공백을 제거했는데도 "[:인수가 너무 많습니다"라는 오류가 계속 발생합니다.
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개의 파일 이름을 유지하면 작동하지만 이 파일 이름 개수 때문에 오류가 발생합니다.
조건이 있는 경우 단락이 필요한가요? 아니면 다른 조건이 필요한가요? 도와주세요.
인사
답변1
[[ var = pattern ]]
Korn 쉘의 or [[ var == pattern ]]
연산자(현재 다른 쉘에서는 지원되지만 표준 구문의 일부는 아님 ) 가 있으며 문자열 동등 비교 연산자를 지원하는 명령이 sh
있습니다 .[
=
일부 [
구현에서는 ==
연산자도 지원하지만 이는 =
패턴 일치가 아닌 문자열 동일성을 위한 별칭일 뿐입니다. 일부 [
구현(예: 정규식 일치를 위한 [
내장 yash
또는 지원 연산자)은 표준 + 유틸리티 구문에서는 사용할 수 없습니다.zsh
=~
sh
[
그냥 평범한 명령인데,
[ "$FILE" == "csharp-plugin"* ]
다음과 같이 해석됩니다.
echo "$FILE" == "csharp-plugin"* ]
"csharp-plugin"*
또는 셸에서 다음과 같은 메커니즘을 통해 현재 디렉터리의 파일 이름 목록으로 확장된 간단한 명령csharp-plugin
와일드카드또는파일 이름 생성또는경로명 확장그리고 이를 별도의 매개변수로 에 전달합니다 [
.
따라서 현재 디렉토리에 csharp-plugin1
and 가 포함되어 있으면 , 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 셸에서 또는 bash 셸 및 이후 shopt -s extglob
(최신 버전에서는 필요하지 않음 bash
)를 사용하거나 zsh 및 이후를 사용하여 set -o kshglob
다음을 수행할 수도 있습니다.
if [[ $FILE = @(csharp|flex|go|...)-plugin* ]]; then...
에서 zsh
, 없이 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