Считайте значения в переменную оболочки от канала

Я пытаюсь заставить удар обрабатывать данные от stdin, который передается по каналу в, но никакая удача. То, что я имею в виду, не является ни одной из следующей работы:

echo "hello world" | test=($(< /dev/stdin)); echo test=$test
test=

echo "hello world" | read test; echo test=$test
test=

echo "hello world" | test=`cat`; echo test=$test
test=

где я хочу, чтобы вывод был test=hello world. Я попытался поместить "" кавычки вокруг "$test" это не работает также.

193
задан codeforester 24 August 2018 в 18:12
поделиться

4 ответа

Конвейерная передача чего-либо в выражение, включающее присваивание, не ведет себя подобным образом.

Вместо этого попробуйте:

test=$(echo "hello world"); echo test=$test
3
ответ дан 23 November 2019 в 05:26
поделиться

, если вы хотите читать много данных и работать с каждой строкой отдельно, вы можете использовать что-то вроде этого:

cat myFile | while read x ; do echo $x ; done

если вы хотите разбить строки на несколько слов, вы можете использовать несколько переменных вместо x, как это :

cat myFile | while read x y ; do echo $y $x ; done

или:

while read x y ; do echo $y $x ; done < myFile

Но как только вы начнете хотеть делать что-нибудь действительно умное с подобными вещами, вам лучше выбрать какой-нибудь язык сценариев, например perl, где вы можете попробовать что-то вроде этого:

perl -ane 'print "$F[0]\n"' < myFile

Там довольно крутая кривая обучения с perl (или, я полагаю, с любым из этих языков), но вам будет намного проще в долгосрочной перспективе, если вы захотите делать что-либо, кроме простейших скриптов. Я бы порекомендовал Perl Cookbook и, конечно же, язык программирования Perl Ларри Уолла и др.

105
ответ дан 23 November 2019 в 05:26
поделиться

Синтаксис неявного канала из команды оболочки в переменную bash -

var=$(command)

или

var=`command`

В ваших примерах вы передаете данные в конвейер. к оператору присваивания, который не ожидает ввода.

13
ответ дан 23 November 2019 в 05:26
поделиться

read не будет читать из канала (или, возможно, результат будет потерян, потому что канал создает подоболочку). Однако вы можете использовать здесь строку в Bash:

$ read a b c <<< $(echo 1 2 3)
$ echo $a $b $c
1 2 3

Но информацию о lastpipe см. В ответе @chepner.

40
ответ дан 23 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: