72

私がやりたいことは次のとおりです。

  1. stdin複数行の入力を変数に読み込むA
  2. でさまざまな操作を行うA
  3. A区切り記号 ( \n\r\tなど) を失わずに別のコマンドにパイプする

read現在の問題は、改行で読み取りが停止するため、コマンドで読み取ることができないことです。

cat次のように、標準入力を で読み取ることができます。

my_var=`cat /dev/stdin`

、しかし、それを印刷する方法がわかりません。改行、タブ、およびその他の区切り文字がまだ存在するようにします。

サンプル スクリプトは次のようになります。

#!/usr/local/bin/bash

A=`cat /dev/stdin`

if [ ${#A} -eq 0 ]; then
        exit 0
else
        cat ${A} | /usr/local/sbin/nextcommand
fi
4

7 に答える 7

79

これは私のために働いています:

myvar=`cat`

echo "$myvar"

周りの引用符$myvarは重要です。

于 2008-10-17T17:04:24.917 に答える
31

Bash には別の方法があります。man bash言及:

コマンド置換$(cat file)は、同等でより高速な に置き換えることができます$(< file)

$ myVar=$(</dev/stdin)
hello
this is test
$ echo "$myVar"
hello
this is test
于 2013-03-07T10:47:31.880 に答える
12

ティーは仕事をします

#!/bin/bash
myVar=$(tee)
于 2014-02-27T09:33:47.297 に答える
7

出力の最後に末尾の改行を保持することに関心がある場合は、これを使用します。

myVar=$(cat; echo x)
myVar=${myVar%x}
printf %s "$myVar"

これはhereのトリックを使用します。

于 2014-09-09T07:01:01.323 に答える
7

はい、私にとってもうまくいきます。ありがとう。

myvar=`cat`

と同じです

myvar=`cat /dev/stdin`

はい、そうです。bashマニュアルページから:

文字を二重引用符で囲むと、引用符内のすべての文字のリテラル値が保持されますが、$、`、\、および履歴拡張が有効な場合は ! は例外です。文字 $ および ` は、二重引用符内でその特別な意味を保持します。

于 2008-10-17T17:12:44.870 に答える
2

read は、オプション -d [DELIMITER] を設定して使用することもできます。ここで、'input' DELIMITER は 1 文字の長さです。設定-read d ''すると、null またはすべての入力まで読み取ります。

とにかく、Bashは変数にnullバイトを保持できないことを覚えておいてください。

read -d'' myvar
echo "$myvar"

Obs: 末尾の改行バイトは保持されませんが..

于 2021-09-14T20:21:14.903 に答える