在shell脚本中从文件中读取数字

问题描述 投票:0回答:3

我有一个文件,其中只包含一个大数字。我需要将此数字保存在整数变量中,以便在数学运算中使用它。

我尝试过:

var=$(<filename)
但它将其保存为字符串。

shell
3个回答
11
投票

常见的 shell 脚本(bash、sh)中没有整数变量——所有变量都是字符串或数组。所以正常使用变量即可:

$ echo 2 > test
$ X=$(< test)
$ Y=$(($X + 2))
$ echo $Y
4

1
投票

如果我了解您正在尝试从文件中读取值并检查它是否为素数,那么您的问题不是文件中的值。问题是你的 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 

0
投票

我不得不使用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



© www.soinside.com 2019 - 2024. All rights reserved.