尝试分配给非变量?

use*_*550 7 bash shell-script variable

我们可以在 shell 脚本函数中使用算术运算:

function mess
{
   if (( "$1" > 0 )) ; then
      total=$1
   else
      total=100
   fi
   tail -$total /var/adm/messages | more
}
Run Code Online (Sandbox Code Playgroud)

我尝试对函数 args 执行此算术运算:

#!/bin/bash
byte="Bytes"
kilo="KB"
mega="MB"
giga="GB"
function bytesToUnites() {
if (( "$1" < 1000 )) 
then
    echo $1" "$byte
elif (( $1 < 1000000 ))
then
    let $1/=1000
    echo $1" "$kilo
fi
}

bytesToUnites 28888
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

line 12: let: 28888/=1000: attempted assignment to non-variable (error token is "/=1000")
28888 KB
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Jos*_* R. 7

问题是您试图通过在第一个位置参数名称前加上来执行参数替换$

你可以像这样完成你想要的:

...
elif [ $1 -lt 1000000 ]
then
    arg="$1"
    let arg/=1000
    echo $arg" "$kilo
fi
Run Code Online (Sandbox Code Playgroud)

据我所知,您不能通过以下方式直接使用位置参数:

let 1/=1000
Run Code Online (Sandbox Code Playgroud)

因为这将是一个语法错误。

顺便说一句,从您的错误消息中,我可以看到$1设置为28888. 您应该注意到 Bash 不进行浮点运算。您会发现arg设置为28(28888 除以 1000 的整数商)而不是 28.888。请参阅有关如何在脚本中进行浮点运算的精彩问答