2016-05-18 51 views
-1

我試圖從bash腳本中讀取stdin中的length字符,但我無法弄清楚如何將長度作爲變量傳遞。如何在bash中讀取可變數量的字符?

這是腳本應該(TM)工作:

for i in {1..9} 
do 
    read line 
done 

array=(${line}) 
length=${array[1]} 

echo "$length" >> /home/ubuntu/test 
read line 
read -n $length line 

echo "$line" >> /home/ubuntu/test 

echo "done" >> /home/ubuntu/test 

,但是,當我的貓/home/ubuntu/test我沒有看到最後的讀取數據:

20558 

done 

但是,如果我用read -n 20558 line替換read -n $length line我在文件中得到預期的數據。

如何將長度作爲變量傳遞給read

編輯

OK,我在length有一個換行符。此作品:

read -n ${length:0:-1} line 
+0

在{1..9}'循環中爲'i中的'read line'的目的是什麼? – anubhava

+0

,這樣我就可以得到剩餘輸入的長度。 – Andrew

+0

長度運算符'#'怎麼樣,請參見[這個問題](http://stackoverflow.com/q/17368067/4241932)。 – Matthew0898

回答

0

awk來救援!

awk 'NR==9{len=$2} NR==11{print substr($0,1,len); exit}' 

根據您的腳本,第9行的第二個字段定義了要從第11行讀取的長度。

+0

這幾乎可行,但它需要很長時間。這是一個響應github webhook的web服務器,如果我閱讀最後一行(或使用awk腳本),它會超時。如果我使用'read -n'並指定字符數量,但僅在硬編碼字符數時才起作用。 – Andrew

+0

好吧,不知道用例。這首先讀完整行,然後剁碎它,而不是爲你工作。然而,硬編碼的數字應該沒有問題,因爲在調用read之前,bash將首先替換變量。 – karakfa

+0

@Andrew你是什麼意思的「幾乎成功」?它是否給出了正確的答案?你的輸入數據是如何實際顯示的?你想從中提取什麼? –

相關問題