我有一个文件,其中只包含一个大数字。我需要将此数字保存在整数变量中,以便在数学运算中使用它。
我尝试过:
var=$(<filename)
但它将其保存为字符串。
常见的 shell 脚本(bash、sh)中没有整数变量——所有变量都是字符串或数组。所以正常使用变量即可:
$ echo 2 > test
$ X=$(< test)
$ Y=$(($X + 2))
$ echo $Y
4
如果我了解您正在尝试从文件中读取值并检查它是否为素数,那么您的问题不是文件中的值。问题是你的 shell 语法。根据您的问题和评论,您似乎正在尝试执行以下操作:
#!/bin/sh
num=$(<"$1")
i=2
f=0
while [ $i -le $(expr $num / 2) ]; do
if [ $(expr $num % $i) -eq 0 ]; then
f=1
fi
i=$(expr $i + 1)
done
if [ $f -eq 1 ]; then
echo "The number is composite"
else
echo "The number is Prime"
fi
使用/输出
$ cat dat/pnumber.txt
31
$ sh prime.sh dat/pnumber.txt
The number is Prime
$cat dat/npnumber.txt
32
$ sh prime.sh dat/npnumber.txt
The number is composite
问题是您未能认识到
expr
是一个单独的命令,必须用反引号或 $()
括起来才能将表达式的值返回到变量或在测试构造中使用它。
如果您更愿意使用旧的 backtick 命令替换语法,则以下内容相当于上面显示的内容:
while [ $i -le `expr $num / 2` ]; do
if [ `expr $num % $i` -eq 0 ]; then
f=1
fi
i=`expr $i + 1`
done
我不得不使用Python计算,因为bash算术不支持浮点数:
CPU_TEMPERATURE_fOffset=/sys/bus/iio/devices/iio:device0/in_temp0_offset
CPU_TEMPERATURE_fScale=/sys/bus/iio/devices/iio:device0/in_temp0_scale
alias QA_READ_ZINQ_TEMP="echo -n "fRaw="; sudo cat $CPU_TEMPERATURE_fRaw;echo -n "fOffset=";sudo cat $CPU_TEMPERATURE_fOffset;echo -n "fScale=";sudo cat $CPU_TEMPERATURE_fScale;"
F_QA_ZINQ_TEMP_DIAG()
{
QA_READ_ZINQ_TEMP
echo "Calculating temperature using formula: ((raw + offset) * scale) / 1000"
raw=$(< $CPU_TEMPERATURE_fRaw)
offset=$(< $CPU_TEMPERATURE_fOffset)
scale=$(< $CPU_TEMPERATURE_fScale)
echo -n "Temperature is: "
python_command="print((($raw+$offset)*$scale)/1000)"
python3 -c $python_command
}
alias QA_ZINQ_TEMP_DIAG=F_QA_ZINQ_TEMP_DIAG
Using it worked for me:
$ QA_ZINQ_TEMP_DIAG
fRaw=2536
fOffset=-2219
fScale=123.040771484
Calculating temperature using formula: ((raw + offset) * scale) / 1000
Temperature is: 39.742169189332