2017-04-25 9 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から実行するコマンドを受け入れる場合は、別の方法でHEREドキュメントを使用することができます(bashのマニュアルページのセクションHere Documentsを参照してください)。

更新:Gordon Davisson氏のコメントが正しいです。 \'も機能しません。 pbshは、あなたは、彼が示唆したように、引用符で周りいじるか、すなわち個別のファイルおよび使用にpbshのための入力全体を置くことができるのいずれか1つの引数として実行するコマンドを得ることに主張

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

バックスラッシュを使用してエスケープすることは、一重引用符で囲まれた文字列では機能しません。一重引用符で囲まれた文字列を終了してから、一重引用符をエスケープしてから、一重引用符で囲んだ新しい文字列を始める必要があります。このようなもの: 'awk '\' '{print $ 9}' \ ''' 'pbsh'コマンドがそれを受け入れるならば、ここの文書(引用符で区切られた区切り文字)はもっと簡単になります。 –

+0

awk '\' '{print $ 9}' \ ''のように変更した後に動作しました。しかし、スクリプトは実行中にif文ブロックを完全に表示しています。私はここで確認して使用します。それが良いことを願っています。 – Veer

+0

@Veer:私の更新された答えに注意してください。たぶん、これはより保守的な解決策につながるでしょう。 – user1934428

関連する問題