2017-04-25 2 views
0
#!/bin/bash 
echo "Number of hosts entered are "$# 
echo "Hostnames are "[email protected] 
for i in "[email protected]" 
do 
    echo "Logging in to the host "$i 
    pbsh [email protected]$i ' 
    ipaddr=`ip r | awk '{print $9}'` 
    if [ ipaddr = 172.*.*.* ] 
    then 
     echo "Script can not be run in this IP series" 
     exit 
    else 
     cd /var/tmp ; wget http://********** 
    fi' 
done 

위의 스크립트를 실행 한 후 오류가 발생합니다. 스크립트가 실행되고 있지만 원하는 방식으로 실행되지 않습니다.쉘 스크립트에서 awk 명령을 사용하여 인쇄 할 수 없습니다.

awk : cmd. 줄 : 1 : {print

awk : cmd. 줄 : 1 :^예상치 못한 줄 바꿈 또는 문자열 끝

나는 스크립팅에 초보자입니다. 친절하게도 스크립트에서 잘못된 것이 있으면 올바르게 수정하십시오.

+1

귀하 주요 문제는'''''pbsh'의 끝에있는''입니다. 이것은'awk'에서 또 다른''에 의해 끝납니다. 그래서'\ ''를 사용하여 후자를 벗어나기를 원할 것입니다. 또 다른 것은'if' 문입니다. ** ipaddr ** string 대신에'$ ipaddr' 변수를 검사하지 않는다면 절대로 안됩니다. – Rogus

답변

0

게시 한 목록에서 pbsh 줄의 시작 작은 따옴표는 작은 따옴표 바로 다음에 awk 명령 다음에 닫힙니다. 후자는 백 슬래시를 접두사로 사용하여 이스케이프 처리 할 수 ​​있습니다.

pbsh가 stdin에서 실행될 명령을 받아들이면 다른 방법으로는 여기에 문서를 사용할 수 있습니다 (bash 매뉴얼 페이지, 여기 Documents Documents 참조).

업데이트 : 고든 데이비슨 (Gordon Davisson)이 그의 코멘트에 있습니다. \'도 작동하지 않습니다. pbsh, 당신은, 그가 제안, 따옴표 주변에 바이올린, 또는 즉, 별도의 파일 및 사용에 pbsh에 대한 전체 입력을 넣을 수있는 하나 하나의 인수로 실행되는 명령을 받고 주장

pbsh [email protected]$i $(<input_script.pbsh) 
+1

작은 따옴표로 묶은 문자열에서 백 슬래시로 이스케이프가 작동하지 않습니다. 작은 따옴표로 묶은 문자열을 끝내고 이스케이프 된 작은 따옴표를 사용한 다음 작은 따옴표로 묶은 새 문자열을 시작해야합니다. 다음과 같은 것 :'awk '\' '{print $ 9}'\ '''. 'pbsh' 명령이 그것을 받아들이면 여기에 인용 부호로 묶인 (delimiter) 문서가 더 간단해질 것입니다. –

+0

awk '\' '(print $ 9)'\ ''와 같이 수정 한 후에 작동합니다. 그러나 스크립트는 if 문을 완전히 실행하는 동안 블록을 표시합니다. 나는 여기에서 문서를 확인하고 사용할 것이다. 희망이 좋다. – Veer

+0

@Veer : 업데이트 된 답변에 유의하십시오. 어쩌면 이것이 더 유지하기 쉬운 해결책으로 이어진다. – user1934428