Скажите, если бы я хотел сделать эту команду:
(cat file | wc -l)/2
и сохранить его в такой переменной, как middle, как мне это сделать?
Я знаю, что это просто не случай
$middle=$(cat file | wc -l)/2
как бы мне это сделать?
middle=$((`wc -l < file` / 2))
Это полагается на то, что 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))
middle=$((`wc -l file | awk '{print $1}'`/2))
с использованием 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"
При назначении переменных вы не используете $
Вот что я придумал:
mid=$(cat file | wc -l) middle=$((mid/2)) echo $middle
Двойные скобки важны во второй строке. Я не уверен, почему, но я думаю, это говорит Bash, что это не файл?