답변:
시도해 볼 수 있습니다 :
eval rm foo.{$ext0..$extN}
이것이 최선의 대답인지 확실하지 않지만 확실히 대답입니다.
{$one..$three}
, 그것은이 경우 정수를 기대하고 중괄호 확장의 올바른 양식을하지 않습니다 때문에 만 $ var에 확장 한 후 올바른 형태가된다 ... 이는 eval
다음 일반 브레이스 시퀀스 확장 ... 1 2 3 QED 생성하는 동일한 프로세스를 통과) ... 요약 : 단순한 존재 중괄호 쌍 does't 트리거 브레이스 확장 용으로 만 유효한 형태 트리거를 .
a={0..9}; echo $a;
이없는 것과 같은 변수를 사용하는 경우 . 를 사용 하면 작동합니다. 그래서 @mattdm의 설명이 좋습니다. eval
당신이 이미 실현으로, {1..3}
로 확장 1 2 3
하지만, {foo..bar}
또는 {$foo..$bar}
하지 트리거 중괄호 확장을, 후자는 이후 대체 확장 $foo
하고 $bar
그 값에 의해.
GNU (예 : 내장되지 않은 Linux)에 대한 폴 백이 seq
명령입니다.
for x in `seq $ext0 $extN`; do rm foo.$x; done
또 다른 가능성. 경우 foo.
에는 쉘 특수 문자를 포함하지이며,
rm `seq $ext0 $extN | sed 's/^/foo./'`
가장 간단한 해결책은 zsh를 사용 rm foo.{$ext0..$extN}
하는 것입니다.
다른 답변을 사용하여 논의하는 동안 eval
과 seq
에 bash
, 당신은 전통적인 C 스타일 사용할 수 있습니다 for
산술 상황에서 루프를. 변수 ext0
와 변수 extN
가 확장되어 ((..))
정의 된 범위에 대해 루프가 실행됩니다.
for (( idx = ext0; idx <= extN; idx++ )); do
[[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
rm "$foo.$idx"
done
최적의 방법을 찾고 여러 rm
명령을 피하려면 임시 자리 표시자를 사용하여 파일 이름 결과를 저장하고 rm
한 번에 호출 할 수 있습니다 .
results=()
for (( idx = ext0; idx <= extN; idx++ )); do
[[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
results+=( "$foo.$idx" )
done
이제 rm
확장 배열 에서 명령을 호출하십시오.
rm -- "${results[@]}"