쉘에서 자연어 루프 [닫힘]


0

루프 구문을 명시 적으로 사용하지 않고 일련의 입력에서 루프로 명령을 실행하는 자연스러운 방법이 있습니까? 나는 우리가 영어로 말하는 방식과 유사한 방식을 의미합니다.

예를 들어

some-command -a john,jane -b doe,roe

대신에

for a in john jane; do
   for b in doe roe; do
     some-command -a $a -b $b
   done
done

당신은 이것을 할 수 있습니까 bash? 이와 같은 기능을 가진 또 다른 쉘이 있습니까?

여기에 넣은 것과 똑같은 구문 일 필요는 없지만 중첩 루프만큼 부피가 큰 관용적 인 것은 아닙니다.


이것은 전적으로 명령 및 / 또는 쉘에 달려 있습니다. 실제로 해결하려는 문제가 있습니까? 아니면 원하는 경우에 대해 이론화하고 있습니까?
music2myear

알아. 해당 기능이없는 명령을 처리하고 있으므로 쉘에서 무언가를 찾고 있습니다.
saintali

내 예는kubectl --context=context1,context2 --namespace=ns1,ns2 get pod
saintali

* nix의 철학은 자체 스크립트 및 명령 작성과 같은 사용자 지정에 매우 무겁습니다. 그래서 당신은 아마 당신 자신의 것을 쓸 수 있습니까?
barlop

또한 쉘을 보는 것 외에도 스크립팅 언어를 고려할 수 있습니다. Rebol은 아마도 자연스럽게 사용되는 스크립트 언어 일 것입니다. 그러나 때로는 더 자연스러워 지려는 언어에 대한 시도는 때때로 구문을 제대로 이해하는 데 까다로울 수 있습니다.
barlop

답변:


1

for쉘 함수에서 루프를 숨길 수 있습니다. 다음은 질문의 예를 기반으로 다소 취약한 구현입니다.

loop ()
{
    for i in `echo $3 |tr ',' ' '`;
    do
        for j in `echo $5 |tr ',' ' '`;
        do
            $1 $2 $i $4 $j;
        done;
    done;
}

그러면 함수가로 호출됩니다 loop some-command -a john,jane -b doe,roe. 예를 들어 :

$ for i in /{bin,media}; do for j in /{srv,tmp/tmp}; do \ls -d $i $j; done; done
/bin  /srv
/bin  /tmp/tmp
/media  /srv
/media  /tmp/tmp
$ loop ls -d /bin,/media "" /srv,/tmp/tmp
/bin  /srv
/bin  /tmp/tmp
/media  /srv
/media  /tmp/tmp
$ _

글쎄, 그것이 올바른 방향으로 나아가는 단계라고 생각합니다. 하지만 항상 2 레벨의 중첩 된 것으로 가정합니다 for. 역동적으로 만들 방법이 없나요?
saintali

괄호 확장 예제에 감사드립니다. 그것은 나에게 아이디어를 줬다!
saintali

0

나는 여전히 더 나은 답변을 찾고 있지만 여기에 임시 "솔루션"이 있습니다.

bash에서 괄호 확장에 대해 배운 후에 이것이 내가 생각해 냈습니다. 불행히도 명령에서 모든 특수 문자를 이스케이프하거나 따옴표를 사용해야합니다.

eval 'some-command -a '{john,jane}' -b '{doe,roe}';'
eval some-command\ -a\ {john,jane}\ -b\ {doe,roe}\;

예를 들어

eval 'kubectl --context='{context1,context2}' --namespace='{ns1,ns2}' get pod;'
eval kubectl\ --context={context1,context2}\ --namespace={ns1,ns2}\ get\ pod\;

여전히 다소 어색합니다. 다른 쉘에 더 나은 옵션이 있는지 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.