如何将命令的输出除以2,并将结果存储到bash变量中?

如何将命令的输出除以2,并将结果存储到bash变量中?,bash,unix,shell,Bash,Unix,Shell,如果我想执行此命令: (cat file | wc -l)/2 并将其存储在变量(如middle)中,我将如何执行该操作 middle=$((`wc -l file | awk '{print $1}'`/2)) 我知道这根本不是我的情况 $middle=$(cat file | wc -l)/2 那么我该怎么做呢?middle=$(`wc-l

如果我想执行此命令:

(cat file | wc -l)/2
并将其存储在变量(如middle)中,我将如何执行该操作

middle=$((`wc -l file | awk '{print $1}'`/2))
我知道这根本不是我的情况

$middle=$(cat file | wc -l)/2
那么我该怎么做呢?

middle=$(`wc-lmiddle=$((`wc -l file | awk '{print $1}'`/2))

分配变量时,不使用$

以下是我的想法:

mid=$(cat file | wc -l)
middle=$((mid/2))
echo $middle
第二行的双括号很重要。我不知道为什么,但我猜它告诉Bash它不是一个文件?

使用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"
linec(){
i=0
而read-r行
做
((i++)
完成<“$1”
回声$i
}
中间=$(linec“文件”)
回音“$middle”

这依赖于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))

老实说,我不想使用awk,没有它也有办法,我只是在读一本书,上面说不要使用sed或awk。上面的命令可以在没有wc的情况下完成。只要
awk
就可以了。当您使用sed或awk解决问题时,您现在有两个问题:我们赢了。就在我读完手册回来的时候。(我通常使用vanilla/bin/sh编写脚本,所以我总是要查找bashisms)@blahdiblah:你注意到OP是如何使用
$()
而不是反勾号的吗?另外,您还可以纠正对
cat
的无用使用,但随后您将其替换为对重定向的无用使用
wc
接受文件名作为参数。另外,
wc
输出文件名,在您进行除法之前需要去掉该文件名。@dennis,重定向有“目的”。它消除了文件名,只给出行数。
wc-l
只获取行数。仅供参考。