2017-12-12 8 views
0

모든 것을 이스케이프 처리하여 한 줄짜리 쉘 스크립트를 변환하는 방법은 무엇입니까? 예를 들어 행 끝을 \ n으로 바꾸고 다른 백 슬래시 및 기타 필요한 항목을 두 배로 지정하십시오.필요한 것을 탈출하여 쉘 스크립트를 하나의 라이너로 변환 하시겠습니까?

#!/bin/bash 

HOSTNAME=$hostname 
DATA="" 
RETRY=50 

echo $HOSTNAME 

sleep 1m 

while true; do 

while [ $RETRY -gt 0 ] 
do 
    DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/process) 
    if [ $? -eq 0 ] 
    then 
     break 
    else 
     if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; 
     then 
      echo "Server is already running" 
     else 
      echo "Server is not running so starting it" 
      /opt/abc/hello start 
     fi 
     let RETRY-=1 
     sleep 30 
    fi 
done 

if [ $RETRY -eq 0 ] 
then 
    echo "Server is still down. Exiting out of shell script." >&2 
    exit 2 
fi 

echo "Server is up. Now parsing the process." 
#grep $DATA for state 
state=$(grep -oP 'state: \K\S+' <<< "$DATA") 
[[ -z "$state" ]] && state=0 

echo "$state" 

#validate the conditions 
if [[ "$state" == "DONE" || "$state" == "0" ]]; then exit 0; fi 

#wait another 30 seconds 
sleep 30 

done 

중 필요한 모든 일을 탈출하여 파이썬 또는 Linux를 사용하여 한 줄에 위의 스크립트를 변환 할 수있는 방법이 있나요?

+0

왜 그게 좋을까요? 각 줄 바꿈은 세미콜론으로 바꿀 수 있습니다. – tripleee

+0

'do','then' 및'else' 다음에';'는 사용할 수 없습니다. – Cyrus

+0

@Cyrus 설명해 주셔서 감사합니다. 내 대답 업데이트, – tripleee

답변

1

왜 그럴까요? 각 줄 바꿈은 세미콜론으로 바꿀 수 있으며 기본적으로이 줄 바꿈입니다. do, thenelse 이후에는 세미콜론을 추가하지 마십시오 (이것을 지적하기 위해 @Cyrus를 주셔서 감사합니다!). 주석도 제거해야합니다.

hostname은 참조되었지만 결코 선언되지 않았습니다. http://shellcheck.net/은 5 개의 경고를 주지만 대부분은 상당히 양호합니다. if [ $? -eq 0 ] 반 패턴은 제가보기에 매우 좋았던 애완 동물 심연입니다.

또한 들여 쓰기가 깨졌음에도 불구하고 실제로는 한 줄짜리가 필요하다고 생각하는 경우 중요하지 않습니다.

(your deleted question에서와 같이) 이것을 파이썬 스크립트에 삽입하려는 경우, 새 라인을 다른 것으로 바꿀 필요가 없습니다. 파이썬은 단순히 '''triple-quoting it'''으로 줄 바꿈을 포함한 문자열을 받아 들일 수 있습니다 (그러나 r'''raw string'''는 파이썬이 백 슬래시를 해석하고 대체하는 것을 피하기를 원할 것입니다).

script=r'''#!/bin/bash 

DATA="" 
RETRY=50 

# avoid copying the variable; quote the string 
echo "$hostname" 

sleep 1m 

while true; do 
    # fix indentation  
    while [ $RETRY -gt 0 ] 
    do 
     # avoid useless use of if [ $? -eq 0 ] 
     # quote URL for mainly stylistic reasons 
     if DATA=$(wget -O - -q -t 1 "http://$hostname:8080/process") 
     then 
      break 
     else 
      if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; 
      then 
       # Consistently use stderr for diagnostic messages 
       echo "Server is already running" >&2 
      else 
       echo "Server is not running so starting it" >&2 
       /opt/abc/hello start 
      fi 
      let RETRY-=1 
      sleep 30 
     fi 
    done 

    if [ $RETRY -eq 0 ] 
    then 
     echo "Server is still down. Exiting out of shell script." >&2 
     exit 2 
    fi 

    # stderr again 
    echo "Server is up. Now parsing the process." >&2 
    state=$(grep -oP 'state: \K\S+' <<< "$DATA") 
    # use a default 
    state=${state:-0} 
    echo "$state" 

    if [[ "$state" == "DONE" || "$state" == "0" ]]; then exit 0; fi 

    sleep 30 
done''' 

여기는 세미콜론입니다. 요약하면, 당신은 그 아이디어를 얻을 것이라고 확신합니다.

DATA=""; RETRY=50; echo "$hostname"; sleep 1m; while true; do \ 
while [ $RETRY -gt 0 ]; do if DATA=$(wget -O - -q -t 1 "http://$hostname:8080/process"); then break; ...