在Bash中减去两个变量

too*_*oop 203 unix bash shell

我有下面的脚本来减去两个目录之间的文件计数,但COUNT=表达式不起作用.什么是正确的语法?

#!/usr/bin/env bash

FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV  ## -> gives 'command not found' error
echo $COUNT
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 347

尝试使用此Bash语法,而不是尝试使用外部程序expr:

count=$((FIRSTV-SECONDV))
Run Code Online (Sandbox Code Playgroud)

顺便说一句,正确的使用语法expr是:

count=$(expr $FIRSTV - $SECONDV)
Run Code Online (Sandbox Code Playgroud)

但请记住,使用expr比我上面提供的内部Bash语法要慢.

  • 这种形式比使用expr外部程序更快. (4认同)
  • 谢谢.Backtick是旧的shell语法.BASH支持用于命令替换的新`$(command)`语法.此外,由于BASH支持`$((...))`中的算术运算,最好不要使用外部实用程序`expr` (2认同)

Aar*_*aid 216

你只需要在减号周围加一点额外的空格,然后反写:

COUNT=`expr $FIRSTV - $SECONDV`
Run Code Online (Sandbox Code Playgroud)

请注意退出状态:

如果EXPRESSION既不是null也不是0,则退出状态为0;如果EXPRESSION为null或0,退出状态为1.

在bash脚本中结合使用set -e时,请记住这一点,如果命令以非零状态退出,则会立即退出.

  • 这个答案也适用于posix`sh` shell.为了便于携带,您可能希望使用此答案. (2认同)

pax*_*blo 29

您可以使用:

((count = FIRSTV - SECONDV))
Run Code Online (Sandbox Code Playgroud)

根据以下记录,避免调用单独的进程:

pax:~$ FIRSTV=7
pax:~$ SECONDV=2
pax:~$ ((count = FIRSTV - SECONDV))
pax:~$ echo $count
5
Run Code Online (Sandbox Code Playgroud)


Pur*_*ret 12

这就是我总是在Bash中做数学的方法:

count=$(echo "$FIRSTV - $SECONDV"|bc)
echo $count
Run Code Online (Sandbox Code Playgroud)

  • 只有在处理浮点数时才有必要. (5认同)
  • 我意识到这一点,但我宁愿习惯用`| bc`类型命令捕获这些情况,而不是错过它一两次.他们说不同的人不同的笔画. (2认同)

Kar*_*ath 12

白色空间很重要,expr期望它的操作数和运算符作为单独的参数.您还必须捕获输出.像这样:

COUNT=$(expr $FIRSTV - $SECONDV)
Run Code Online (Sandbox Code Playgroud)

但是使用内置算术扩展更常见:

COUNT=$((FIRSTV - SECONDV))
Run Code Online (Sandbox Code Playgroud)


Sha*_*hin 6

对于简单的整数运算,您还可以使用内置的let命令。

 ONE=1
 TWO=2
 let "THREE = $ONE + $TWO"
 echo $THREE
    3
Run Code Online (Sandbox Code Playgroud)

有关更多信息let,请查看此处