簡體   English   中英

Bash腳本只讀取文件的第一行

[英]Bash script only read the first line of the file

我寫了一個ssh到遠程服務器的腳本來查找用戶的磁盤使用情況。 但是,此腳本只能讀取第一行,它不會在文件的其他行上繼續。 我的腳本出了什么問題? 謝謝。

#!/bin/bash
FILE="myfile.txt"
while read line; do
server=`echo $line|awk '{print $1}'`
cpid=`echo $line|awk '{print $2}'`
echo $server "---" $cpid "---" `ssh $server grep $cpid /var/cpanel/repquota.cache|awk '{print int($3/1000) "MB"}'`
done < $FILE

myfile.txt內容:

server1 user1
server2 user2
server3 user3

ssh調用繼承了while循環的標准輸入,while循環從文件重定向。 這會導致ssh命令占用文件的其余部分。 您需要使用不同的文件描述符來提供read命令:

#!/bin/bash
FILE="myfile.txt"
while read -u 3 server cpid; do
  printf "$server---$cpid---"
  ssh $server "grep $cpid /var/cpanel/repquota.cache | awk '{print int($3/1000) \"MB\"}'"
done 3< $FILE

另一種方法是顯式地將輸入從/dev/null重定向到ssh ,因為你還沒有使用它。

#!/bin/bash
FILE="myfile.txt"
while read server cpid; do
  printf "$server---$cpid---"
  < /dev/null ssh $server "grep $cpid /var/cpanel/repquota.cache | awk '{print int($3/1000) \"MB\"}'"
done < $FILE

首先,您可以簡化讀取循環

while read server cpid; do
    echo $server "---" $cpid "---" `ssh ...`
done <$FILE

並使用awk保存解析。 另一個簡化是保存對grep的調用,讓awk搜索$cpid

ssh $server "awk '/$cpid/ {print int(\$3/1000) \"MB\"}' /var/cpanel/repquota.cache"

對於你的問題,我猜ssh調用沒有返回,因為它等待密碼或其他東西,因此阻止循環繼續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM