bash 명령줄 - sh -c의 여러 줄을 단일 줄로 변환하는 방법

bash 명령줄 - sh -c의 여러 줄을 단일 줄로 변환하는 방법

OSX 명령줄에는 다음과 같은 몇 가지 논리가 있습니다.

for i in {1..10}
do
   for j in {1..10}
   do
       echo "test inner"
   done;
   echo "test outer"
done

잘 작동합니다. 하지만 에서 실행하고 싶습니다 nohup. 그래서 위의 내용을 한 줄로 결합하여 맞춰야합니다.nohup sh -c "{a single line}"

그러나 다음 줄에서는 오류가 발생합니다. 위의 모든 개행 문자를 건너뜁니다.

sh -c 'for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'

실수:

sh: -c: line 0: syntax error near unexpected token `echo'
sh: -c: line 0: `for i in {1..10} do for j in {1..10} do echo "test inner" done; echo "test outer" done'

편집하다:

명령에 대한 자격 증명이 가볍게 보호되기 때문에 파일로 실행하고 싶지 않습니다. 내가 생각할 수 있는 가장 쉬운 방법은 공유 VM에 파일이 남아 있지 않도록 명령으로 실행하는 것입니다. 이것이 자격 증명을 얼마나 잘 보호하는지, 아니면 더 좋은 방법이 있는지는 모르겠습니다. 더 많은 제안/아이디어를 환영합니다.

편집하다:

bash와 작은따옴표를 사용하여 작동시키세요. (Tigger의 답변을 바탕으로)

bash -c 'for i in {1..10}; do for j in {1..10}; do echo "test inner"; done; echo "test outer"; done;'

답변1

내 생각에는 두 가지 옵션이 있습니다.

  1. 스크립트 파일에 넣고 실행
  2. 위의 더 큰 코드 창에 있는 모든 개행 문자를 세미콜론으로 바꿉니다.

개인적으로는 1을 선택하겠습니다.

답변2

매개변수에 포함된 줄바꿈에는 문제가 없습니다 sh -c. 대신 구문(이제 다른 쉘에서 지원됨) {1..10}입니다 . on 이외의 것을 출력하는 경우 이는 POSIX 적합성 위반이므로 새 버전에서 이를 수정할 준비를 해야 합니다. 당신은 그것을 사용할 수 있습니다 :zshshsh{1..20}echo {1..20}

zsh -c '
  for i in {1..10}
  do
     for j in {1..10}
     do
         echo "test inner"
     done
     echo "test outer"
  done'

또는

sh -c '
   i=1; while [ "$i" -le 10 ]
   do
     j=1; while [ "$j" -le 10 ]
     do
       echo "test inner"
       j=$((j + 1))
     done
     echo "test outer"
     i=$((i + 1))
  done'

하지만 단 하나로 할 수 있는 명령을 100개나 실행하는 것은 echo어리석은 일처럼 느껴집니다 .

awk 'BEGIN{
  for (i=1; i<=10; i++) {
    for (j=1; j<=10; j++)
      print "test inner"
    print "test outer"
  }}'

원하는 경우 한 줄에 넣을 수 있습니다.

awk 'BEGIN{for(i=1;i<=10;i++){for(j=1;j<=10;j++)print"test inner";print"test outer"}}'

답변3

한 줄로 변환해 보세요. ;올바른 위치에 일부를 추가했습니다 .

for i in {1..10}; do for j in {1..10}; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;

위 줄은 작동 bash하지만 실행하려면 해당 범위 구문이 지원되지 않기 때문에 (내가 아는 한) sh -c확장해야 합니다 . 이 경우 다음 줄이 나에게 효과적이었습니다.{1..10}sh

sh -c 'for i in 1 2 3 4 5 6 7 8 9 10; do for j in 1 2 3 4 5 6 7 8 9 10; do echo "test inner ${j}"; done; echo "test outer ${i}"; done;'

${j}참고: 확인을 위해 및 를 추가했습니다 ${i}.

관련 정보