시퀀스의 쉘 중괄호 확장에서 $variable을 사용하는 방법은 무엇입니까?

시퀀스의 쉘 중괄호 확장에서 $variable을 사용하는 방법은 무엇입니까?

$var inBash에서 범위가 있는 쉘 중괄호 확장을 사용하고 싶습니다 . 단순히 {$var1..$var2}작동하지 않아서 "수평"으로갔습니다 ...

다음은 작동하지만 약간 혼란스럽습니다.

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments

좀 더 "일반적인" 방법이 있나요?

답변1

다음을 시도해 볼 수도 있습니다.

eval rm foo.{$ext0..$extN}

이것이 최선의 대답인지는 확실하지 않지만 확실히 하나입니다.

답변2

이미 알고 있듯이 확장은 but or not {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./'`

가장 간단한 해결책은 rm foo.{$ext0..$extN}원하는 것을 원하는 곳에 zsh를 사용하는 것입니다.

답변3

    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    f_over_range 0 5
    f_over_range 00 05

노트:

  • eval을 사용하면 명령 주입 보안 위험이 노출됩니다.
  • Linux는 "00\n01\n02..etc"를 인쇄하지만 OSX는 "1\n2\n...etc"를 인쇄합니다.
  • seq 또는 C 스타일 for 루프를 사용하면 중괄호 확장으로 선행 0을 처리하는 것과 일치하지 않습니다.

답변4

루트 디렉터리의 총 파일 수를 찾으려면 다음 명령이 있습니다.

명령 01:

 ls -dq *dog* | wc -l

일련의 숫자를 사용하여 여러 폴더를 만드는 명령도 있습니다.

명령 02:

mkdir -p {0..3}

나는 루트 디렉터리에 이름에 "DOG"라는 문자열이 포함된 3개의 파일을 알고 있습니다.

하지만 다른 루트 폴더에서 01 명령을 사용하고 이름에 "DOG"가 포함된 파일 수를 계산하고 결과를 변수 result에 저장하고 명령 02에 표시된 "3" 대신 이 변수를 사용하고 싶습니다.

하위 폴더 1, 2, 3을 생성하려는 가능한 모든 시도는 다음과 같습니다.

result=$ls -dq *dog* | wc -l) mkdir {0..$result}

result=$(ls -dq *dog* | wc -l) | mkdir {0..$result}

ls -dq *dog* | wc -l | xargs I{} mkdir {0..{}}





ls -dq *dog* | wc -l | while read file; do mkdir -p {1.."$file"}; done

그러나 위의 시도에서는 두 가지 결과만 얻습니다. 이름이 지정된 폴더가 생성되거나 {0..3}결과 인쇄를 받는 것 외에는 아무 일도 일어나지 않습니다.

 ls -dq *dog* | wc -l

해결책은 다음과 같습니다.

보고 있다이 답변원하는 결과를 달성하는 모델을 구축하는 것이 가능합니다.

eval "mkdir -p {1..`ls -dq *dog* | wc -l`}"

mkdir {1 .. $variable}"내부적으로 변수 사용 " 이라는 질문을 했으므로 엄밀히 말하면 가장 적절한 대답은 아닙니다.

관련 정보