Я пытаюсь заставить удар обрабатывать данные от 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"
это не работает также.
Конвейерная передача чего-либо в выражение, включающее присваивание, не ведет себя подобным образом.
Вместо этого попробуйте:
test=$(echo "hello world"); echo test=$test
, если вы хотите читать много данных и работать с каждой строкой отдельно, вы можете использовать что-то вроде этого:
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 Ларри Уолла и др.
Синтаксис неявного канала из команды оболочки в переменную bash -
var=$(command)
или
var=`command`
В ваших примерах вы передаете данные в конвейер. к оператору присваивания, который не ожидает ввода.
read
не будет читать из канала (или, возможно, результат будет потерян, потому что канал создает подоболочку). Однако вы можете использовать здесь строку в Bash:
$ read a b c <<< $(echo 1 2 3)
$ echo $a $b $c
1 2 3
Но информацию о lastpipe
см. В ответе @chepner.