2014-02-18 40 views
4

我想執行一個簡單的腳本來捕獲多個服務器的詳細信息,使用svmatch從服務器名稱輸入文件。而第一次迭代後讀取線停止

#!/bin/sh 
while read line; do 
svmatch $line 
done < ~/svr_input; 

沒有問題的svmatch命令的工作將沿着命令立場執行。

+0

是不是故意的,你是字符串分割和水珠,擴大線從讀文件,修剪尾隨空格,並擴展反斜槓轉義序列?如果你不想做所有這些事情,還需要進行一些其他更改。 –

+0

更明確一點:如果你不想對字符串進行字符串拆分和全局擴展,可以使用'svmatch「$ line」'。如果您不想在輸入中擴展反斜槓轉義序列,請將其設爲'read -r'。如果你不想從輸入中去掉尾隨的空格,那麼在IFS = read的時候使它成爲'。 –

回答

8

/dev/null重定向你內心的命令的標準輸入:

svmatch $line </dev/null 

否則,svmatch能夠消費標準輸入(這當然是剩餘的行列表)。

另一種方法是使用其他文件描述符比標準輸入的默認:

#!/bin/sh 
while IFS= read -r line <&3; do 
    svmatch "$line" 
done 3<svr_input 

...如果使用的是bash,而不是/bin/sh,你有一些其他選擇;比如bash的4.1或更高版本可以分配一個自由的文件描述符,而不是要求被硬編碼特定FD號:

#!/bin/bash 
while IFS= read -r -u "$fd_num" line; do 
    do-something-with "$line" 
done {fd_num}<svr_input 
+0

+1很好的解釋。 – BMW