Programming

IF 문을 사용할 때 쉘 명령을 여러 줄로 나누려면 어떻게해야합니까?

procodes 2020. 3. 4. 07:50
반응형

IF 문을 사용할 때 쉘 명령을 여러 줄로 나누려면 어떻게해야합니까?


명령이 if명령문의 일부일 때 쉘에서 여러 행으로 명령을 분할하려면 어떻게 해야합니까?

이것은 작동합니다 :

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi

작동하지 않습니다.

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi

전체 명령을 실행하는 대신 다음을 얻습니다.

./script.sh: line 73: --forward-agent: command not found

더 중요한 것은 Bash에 대한 이해에서 누락되어 향후에 이와 비슷한 문제를 이해하는 데 도움이되는 것이 무엇입니까?


백 슬래시 다음과 줄 바꿈 앞에 공백 (공백 또는 탭 문자)이 있으면 줄 연속이 실패합니다. 그러한 공백이 없으면 예제가 잘 작동합니다.

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed

주석에서 일부 세부 사항이 승격되었습니다. 쉘의 행 연속 백 슬래시는 실제로 특별한 경우가 아닙니다. 백 슬래시는 바로 뒤 따르는 문자를 "인용"하여 일반적으로 적용되는 특수한 처리를 방지하는 일반적인 규칙의 예입니다. 이 경우 다음 문자는 개행 문자이며 특수 처리가 금지되어 명령이 종료됩니다. 일반적으로 인용 된 문자는 명령에 문자 그대로 포함됩니다. 백 슬래시 줄 바꿈은 대신 완전히 삭제됩니다. 그러나 그렇지 않으면 메커니즘은 동일합니다. 백 슬래시는 바로 뒤 따르는 문자 만 인용합니다. 해당 문자가 공백 또는 탭인 경우 인용 된 공백 또는 탭을 가져 오며 후속 줄 바꿈은 인용되지 않은 상태로 유지됩니다.


Windows / WSL / Cygwin 등 사용자의 경우 :

줄 끝이 표준 Unix 줄 바꿈인지 확인하십시오 \n( 예 : (LF)).

\r\nCRLF ( Windows 줄 끝 ) 줄 끝을 사용하면 명령 줄이 끊어집니다.


가지고 있기 때문이다 \윈도우 라인으로 변환을 끝나는 줄 끝에 \ \r \n.
마크가 위에서 올바르게 설명했듯이 :

백 슬래시 다음과 줄 바꿈 앞에 공백이 있으면 줄 연속이 실패합니다.

여기에는 공백 ( ) 또는 탭 ( \t)뿐만 아니라 캐리지 리턴 ( \r)도 포함됩니다.

참고 : https://stackoverflow.com/questions/18599711/how-can-i-split-a-shell-command-over-multiple-lines-when-using-an-if-statement



반응형