次のスクリプトを実行すると問題があります。 ^予期しない改行または文字列の終わりが発生しました。どうすれば解決できますか?
[root@emrbldbgdapd2 ~]# ./collectdata.sh
collect the data of 10.209.61.124
awk: cmd. line:1: {print
awk: cmd. line:1: ^ unexpected newline or end of string
collect the data of 10.209.61.125
awk: cmd. line:1: {print
awk: cmd. line:1: ^ unexpected newline or end of string
[root@emrbldbgdapd2 ~]#
==========
[root@emrbldbgdapd2 ~]# more collectdata.sh
for i in `cat test`
do echo "collect the data of $i"
ssh -o LogLevel=error -o ConnectTimeout=5 $i 'hostname;
echo "############################";
free -g;
echo "######################################";
echo "######################################";
netstat -nr | grep [0-9] | tr [a-z] [A-Z];
echo "######################################";
echo "######################################";
mount|awk '{print $1,$3,$5}'|sort;
echo "######################################";
echo "######################################";
ip a s | grep -i eth*;
echo "######################################"'>output/$i-`date "+%d%b%Y"`
done
[root@emrbldbgdapd2 ~]#
ベストアンサー1
一重引用符で囲まれた文字列内に一重引用符を使用しようとしています。パイプと同じ行にある最初の内部一重引用符は、mount | awk | sort
その行で始まる一重引用符を終了しますssh
。
実際のエラーはawk
次のコマンドラインを取得します{print ,,}
(呼び出しシェルによって$1
、$3
空$5
の文字列に展開され、現在単一引用符が存在しません)。これは、というファイルで実行されるプログラムの構文awk
エラー(欠落)として解釈されます。}
,,}
参照の問題を回避し、メンテナンスが簡単なプロセスを作成できるように、スクリプトを実際のスクリプトファイルに配置してリモートホストで実行することをお勧めします。
また、
read
結果を繰り返すwhile
代わりにループで使用してください。for
cat
- 特に、内部スクリプトの複数の場所に必要な参照が不足しています。たとえば、
grep [0-9]
ファイル名のグロービングをトリガーしないようにするために必要です。 grep eth*
不思議ですね。そんな意味でしたかgrep -e 'eth.'
?現在のディレクトリで始まるすべての名前を選択するためのファイル名のグロービングパターンとして機能することに加えて、eth
パターン(正規表現として解釈される場合)も一致し、et
その後にゼロ個以上が続きますh
。- バラより* shシェルではバックティック(「cmd」など)は使用されなくなりましたか?バックティックの使用について。
修正されたスクリプト:
#!/bin/sh
now=$( date +%d%b%Y )
if [ -d output ]; then
echo 'Output directory missing' >&2
exit 1
fi
while read host; do
printf 'Collecting data from "%s"...\n' "$host"
ssh -n -o LogLevel=error -o ConnectTimeout=5 "$host" \
sh <<'END_SCRIPT' >output/"$host-$now"
echo '## HOSTNAME:'
hostname
echo '## FREE:'
free -g
echo '## NETSTAT:'
netstat -nr | grep '[0-9]' | tr 'a-z' 'A-Z'
echo '## MOUNT:'
mount | awk '{ print $1, $3, $5 }' | sort
echo '## IP:'
ip a s | grep -i 'eth.*'
END_SCRIPT
done <hosts.txt