2016-05-18 4 views
-1

私はbashスクリプトでstdinからlength文字を読み込もうとしていますが、変数として長さを渡す方法を理解できません。bashで可変数の文字を読むにはどうすればよいですか?

これがなければならない(TM)が動作するスクリプトです:場合は、しかし、

20558 

done 

:私の猫/home/ubuntu/testは私が最後の読み取りからのデータが表示されない

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 

けど、私はread -n $length lineread -n 20558 lineと置き換えます。ファイル内に期待されるデータが得られます。

長さを変数にしてreadに渡すにはどうすればよいですか?

編集

OK、私はlengthに末尾の改行を持っていました。作品:

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

'{i {1..9} 'ループの' '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番目の行の2番目のフィールドは、11番目の行から読み取られる長さを定義します。

+0

これはほとんど動作しますが、時間がかかりすぎます。これはgithub webhookに応答するウェブサーバで、最後の行を読んだり(またはあなたの 'awk'スクリプトを使用すると)タイムアウトします。 'read -n'を使用して文字数を指定すると動作しますが、文字数をハードコードする場合にのみ有効です。 – Andrew

+0

OK、ユースケースを知らなかった。これは最初にフルラインを読み込んだ後、それをチョップし、あなたのために働かないでしょう。しかし、bashはreadを呼び出す前に変数を最初に置き換えるので、数値をハードコーディングすることは重要ではありません。 – karakfa

+0

@Andrew「ほとんどの作品」とはどういう意味ですか?それは正しい答えを与えるか?あなたの入力データは実際どのように見えるのですか、それから何を抽出しようとしていますか? –

関連する問題