질문:
현재 처리 중인 bash 반복 횟수에 액세스할 수 있습니까?
의사 명령
mv {1..5}.something.{1..5} $x1.$x2.something
- 참고: 이는 실제 샘플이 아닌 논리적 표현입니다.
의사 출력
mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
- 여기서 n과 m은 각각 중괄호 확장 반복입니다.
설명하다
나는 다음과 같은 루프에 익숙합니다.
for x in {1..10}; do echo -n "$x "; done
보시다시피 bash는 반복을 $x로 설정합니다. 이것이 가능한지, 그리고 사용할 변수를 정의하지 않은 경우 bash에서 사용하는 변수에 어떻게 액세스할 수 있는지 알고 싶습니다. bash가 주어지면버팀대 확장반복할 변수가 없으면 어떻게든 [내부적으로] 반복해야 합니다. 스크립트가 실행되는 동안 이 변수에 액세스할 수 있기를 원합니다.
참여해주신 모든 분들께 감사드립니다#세게 때리다
답변1
버팀대 확장이 어떻게 작동하는지 오해하고 있습니다. 위의 Dennis Williamson의 의견을 다시 읽어보세요.
mv foo.{1,2,3} bar
내가 를 썼을 때 마치 다음과 같이 입력한 것처럼 쉘이 실제로 명령을 여러 번 호출했다고 생각하십니까 ?
mv foo.1 bar
mv foo.2 bar
mv foo.3 bar
이것이 사실이라면 귀하의 질문은 의미가 있습니다. 셸은 여러 명령을 실행하므로 목록을 유지해야 합니다.
그러나 그것은 사실이 아니다. 스텐트 확장 확장논쟁그런 다음 생성된 명령줄을 호출합니다.한 번. 따라서 위의 예에서 쉘은 인수에 foo.{1,2,3}
중괄호 확장이 포함되어 있음을 확인하고 해당 인수를 세 개의 인수로 확장합니다 foo.1 foo.2 foo.3
. 그런 다음 중괄호 인수 대신 명령줄에 확장을 삽입하고 명령줄 구문 분석을 계속합니다. 완료되면 셸은 다음과 같은 명령을 실행합니다.
mv foo.1 foo.2 foo.3 bar
따라서 쉘이 해당 중괄호 인수를 확장하면 목록을 유지할 수 있지만 중괄호 확장이 완전히 완료되고 확장에 대한 모든 정보가 사용되어 잊혀지기 때문에 다른 인수 확장 시 해당 목록에 액세스할 수 없습니다. 다른 매개변수를 구문 분석할 때.
어쨌든, 그러한 매개변수가 유용할 수 있는 유일한 방법은 쉘이 여러 명령을 실행하는 경우인데, 이는 사실이 아닙니다. 여러 명령을 실행하려면 실제 루프를 사용해야 합니다. 중괄호 확장은 그렇게 하지 않습니다.
이에 관해서는 $_
이것은 루프 변수 대신 사용할 수 있는 Perl 구성이므로( x
루프 예제에서처럼) 실제로 중괄호 확장과 관련이 없습니다.
답변2
특히 mv
이 -v
플래그를 사용하면 현재 처리 중인 내용을 확인할 수 있습니다. @DennisWilliamson이 지적했듯이 중괄호 확장 시퀀스에 대해 설정된 변수가 없습니다. 쓰기는 echo {1..5}
쓰기와 동일합니다 echo 1 2 3 4 5
. 비교 echo "$foo"
- 어떤 변수가 편집되었는지 이후에는 알 수 있는 방법이 없습니다 echo
.
답변3
자신만의 변수를 사용하여 반복 횟수를 계산하고 이를 에코해 보세요. 실행 중에 어떤 일이 발생하는지 확인하려면 -x 옵션을 사용하여 실행하세요. bash -x와 마찬가지로 ex의 위치를 알려줍니다. 하지만 달성하려는 목표가 구체적이지 않으면 도움을 주기가 어렵습니다.