Как разделить вывод команды на два и сохранить результат в переменной bash? - PullRequest
3 голосов
/ 23 февраля 2010

Скажите, если бы я хотел сделать эту команду:

(cat file | wc -l)/2

и сохранить его в такой переменной, как middle, как мне это сделать?

Я знаю, что это просто не случай

$middle=$(cat file | wc -l)/2

как бы мне это сделать?

Ответы [ 5 ]

11 голосов
/ 23 февраля 2010
middle=$((`wc -l < file` / 2))
1 голос
/ 23 февраля 2010

Это полагается на то, что Bash может ссылаться на первый элемент массива, используя скалярный синтаксис, и по умолчанию выполняет деление слов на пробелы.

 middle=($(wc -l file))     # create an array which looks like: middle='([0]="57" [1]="file")'
 middle=$((middle / 2))     # do the math on ${middle[0]}

Вторая строка также может быть:

((middle /= 2))
1 голос
/ 23 февраля 2010
middle=$((`wc -l file | awk '{print $1}'`/2))
0 голосов
/ 23 февраля 2010

с использованием awk.

middle=$(awk 'END{print NR/2}' file)

вы также можете сделать свой собственный "wc", используя только оболочку.

linec(){
  i=0
  while read -r line
  do
    ((i++))
  done < "$1"
  echo $i
}

middle=$(linec "file")
echo "$middle"
0 голосов
/ 23 февраля 2010

При назначении переменных вы не используете $

Вот что я придумал:

mid=$(cat file | wc -l)
middle=$((mid/2))
echo $middle

Двойные скобки важны во второй строке. Я не уверен, почему, но я думаю, это говорит Bash, что это не файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...