2017-02-06 17 views
-1

У меня есть файл, я хочу написать Баш оболочку, чтобы сделать некоторые операции, но, во-первых, мне нужно сортировать их и получить первые 10 строк входной_файлКак использовать конвейер в оболочке bash?

мой код:

#!/bin/bash 

pipe= "${1:-/dev/stdin}" > sort -k2 #----line 4 
i=0 
while [.....]&&[ $i -lt 10 ] do 
.... 
.... 
i=$((i+1)) 
done < "$pipe"      #----line 15 

Выполнить команда:

cat inputfile | ./e4.sh 

но получить разрешение отказано:

./e4.sh: line 4: /dev/stdin: Permission denied 
./e4.sh: line 15: : No such file or directory 

с моего компьютера я могу увидеть файл/Dev/стандартный ввод

[email protected]:/dev# ls 
block kmsg null pts  shm  stdin tty tty1 urandom 
fd  lxss ptmx random stderr stdout tty0 tty2 zero 

Как сделать это правильно. Я имею в виду сортировку и получение 10 лучших строк.

+6

Пожалуйста, посмотрите: http://www.shellcheck.net/ – Cyrus

+4

Подсказка '! # 'Должна быть' #! '(Это' 'фунт bang" 'NOT' "bang pound" '. Нет' '' 'разрешено окружать оператор присваивания '' =' '. Между' ['и выражением (например,' [выражение] ') требуется A' '' '. После присвоения вы ссылаетесь на переменную, предшествуя ее имени, '' $ ''(например,' $ i'). 'less than' conditional -' -lt' not '' lt''. Это все, прежде чем вы столкнетесь с проблемой с перенаправлением назначения' pipe' to 'sort '. После [shellcheck.net] (http://www.shellcheck.net/) отредактируйте свой вопрос, и сообщество может помочь. –

+0

спасибо уже изменилось – user504909

ответ

0

В общем, команда

FOO=BAR BAZ 

выполняет команду БАЗ в среде, которая увеличивается путем установки переменной окружения FOO к значению BAR.

В вашем случае у нас есть нечто подобное. Команда

pipe= "${1-/dev/stdin}" > sort -k2 

устанавливает переменную переменную named pipe в пустую строку, а затем вызывает программу, хранящуюся в $ 1. Если $ 1 не задано, он вызывает/dev/stdin. В вашем случае $ 1 не установлен, поэтому bash пытается выполнить/dev/stdin, что, конечно, не может.