我有下面的脚本来减去两个目录之间的文件数,但是COUNT=表达式不起作用。正确的语法是什么?
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
cunj1qz11#
请尝试使用以下Bash语法,而不要尝试使用外部程序expr:
expr
count=$((FIRSTV-SECONDV))
顺便说一句,使用expr的正确语法是:
count=$(expr $FIRSTV - $SECONDV)
但是请记住,使用expr将比我上面提供的内部Bash语法慢。
kcugc4gi2#
您只需要在减号和反勾号周围多加一点空格:
COUNT=`expr $FIRSTV - $SECONDV`
请注意退出状态:如果EXPRESSION既不为空也不为0,则退出状态为0;如果EXPRESSION为空或0**,则退出状态为1。当在bash脚本中结合使用set -e**时,请记住这一点,如果命令以非零状态退出,则会立即退出。
yvt65v4c3#
您可以用途:
((count = FIRSTV - SECONDV))
以避免调用单独的进程,如以下脚本所示:
pax:~$ FIRSTV=7 pax:~$ SECONDV=2 pax:~$ ((count = FIRSTV - SECONDV)) pax:~$ echo $count 5
tag5nh1u4#
这就是我在Bash中的数学方法:
count=$(echo "$FIRSTV - $SECONDV"|bc) echo $count
20jt8wwn5#
白色很重要,expr要求它的操作数和运算符作为独立的参数。你还必须捕获输出。如下所示:
COUNT=$(expr $FIRSTV - $SECONDV)
但更常见的是使用内置的算术展开式:
COUNT=$((FIRSTV - SECONDV))
ecbunoof6#
对于简单的整数运算,也可以使用内置的let命令。
ONE=1 TWO=2 let "THREE = $ONE + $TWO" echo $THREE 3
有关let的更多信息,请查看此处。
let
wkftcu5l7#
除了建议的3种方法之外,您还可以尝试let,它对变量执行算术运算,如下所示:let COUNT=$FIRSTV-$SECONDV个或let COUNT=FIRSTV-SECONDV
let COUNT=$FIRSTV-$SECONDV
let COUNT=FIRSTV-SECONDV
628mspwn8#
diff_real () { echo "df=($1 - $2); if (df < 0) { df=df* -1}; print df" | bc -l; }
var_a=10 var_b=4 output=$(diff_real $var_a $var_b) # 6 ######### var_a=4 var_b=10 output=$(diff_real $var_a $var_b) # 6
2eafrhcq9#
使用BASH:
# !/bin/bash # home/victoria/test.sh START=$(date +"%s") ## seconds since Epoch for i in $(seq 1 10) do sleep 1.5 END=$(date +"%s") ## integer TIME=$((END - START)) ## integer AVG_TIME=$(python -c "print(float($TIME/$i))") ## int to float printf 'i: %i | elapsed time: %0.1f sec | avg. time: %0.3f\n' $i $TIME $AVG_TIME ((i++)) ## increment $i done
输出
$ ./test.sh i: 1 | elapsed time: 1.0 sec | avg. time: 1.000 i: 2 | elapsed time: 3.0 sec | avg. time: 1.500 i: 3 | elapsed time: 5.0 sec | avg. time: 1.667 i: 4 | elapsed time: 6.0 sec | avg. time: 1.500 i: 5 | elapsed time: 8.0 sec | avg. time: 1.600 i: 6 | elapsed time: 9.0 sec | avg. time: 1.500 i: 7 | elapsed time: 11.0 sec | avg. time: 1.571 i: 8 | elapsed time: 12.0 sec | avg. time: 1.500 i: 9 | elapsed time: 14.0 sec | avg. time: 1.556 i: 10 | elapsed time: 15.0 sec | avg. time: 1.500 $
9条答案
按热度按时间cunj1qz11#
请尝试使用以下Bash语法,而不要尝试使用外部程序
expr
:顺便说一句,使用
expr
的正确语法是:但是请记住,使用
expr
将比我上面提供的内部Bash语法慢。kcugc4gi2#
您只需要在减号和反勾号周围多加一点空格:
请注意退出状态:
如果EXPRESSION既不为空也不为0,则退出状态为0;如果EXPRESSION为空或0**,则退出状态为1。
当在bash脚本中结合使用set -e**时,请记住这一点,如果命令以非零状态退出,则会立即退出。
yvt65v4c3#
您可以用途:
以避免调用单独的进程,如以下脚本所示:
tag5nh1u4#
这就是我在Bash中的数学方法:
20jt8wwn5#
白色很重要,
expr
要求它的操作数和运算符作为独立的参数。你还必须捕获输出。如下所示:但更常见的是使用内置的算术展开式:
ecbunoof6#
对于简单的整数运算,也可以使用内置的let命令。
有关
let
的更多信息,请查看此处。wkftcu5l7#
除了建议的3种方法之外,您还可以尝试
let
,它对变量执行算术运算,如下所示:let COUNT=$FIRSTV-$SECONDV
个或
let COUNT=FIRSTV-SECONDV
628mspwn8#
正实数的比较
用法
2eafrhcq9#
使用BASH:
输出