【问题标题】:Subtract two variables in unix在unix中减去两个变量
【发布时间】:2013-04-20 12:35:52
【问题描述】:

这是我在 UNIX(AIX) 上运行的脚本:

$MON date +"%m"
echo 'expr $MON - 2'

输出:

04
expr $MON - 2

我只想从当前月份中减去 2 并显示。

【问题讨论】:

  • 那么万一月份是0或1,你想显示什么?

标签: shell unix aix


【解决方案1】:

另一种选择:如果你想在一月或二月看到 11 或 12,让 GNU date 算术:

date -d "-2 months" +%m

【讨论】:

    【解决方案2】:

    我意识到AIX 上的默认 shell 是 ksh 的一些变体,它在输入库中没有与 bash 相同的缺陷,但如果你最终要记住这一点在另一个平台上遇到这个。

    如果这是您的输入:

    $MON date +"%m"
    echo 'expr $MON - 2'
    

    那么你有几个问题。

    • $MON 未设置,这会导致调用行 date +"%m",从而给出输出 04
    • echo 命令不执行 expr 命令,因为您使用了错误的刻度,导致输出 expr $MON - 2

    首先,分配你所做的变量VARIABLE=value,在你的情况下应该是:

    MON=`date +"%m"`
    

    不要在= 符号之前或之后放置空格。

    其次,要执行expr,你需要使用反引号(`)

    echo `expr $MON - 2`
    

    但是,对于大多数 shell,您应该使用更现代的版本我想获得命令的结果,这是逻辑$(command)。这些可以嵌入,这使得它们更容易理解(反引号需要转义,反引号越多,需要的转义越多,这很快就会导致反斜杠-palooza)。 对于 bash,您需要确保月份被解释为以 10 为基数的数字,否则一旦到了 8 月,代码将停止工作:

    要强制将该数字解释为以 10 为底的数字,请在其前面加上 10#

    MON=10#$(date +"%m")
    echo $(($MON-2))
    

    例子:

    bash-3.2$ month=07
    bash-3.2$ echo $(($month + 1))
    8
    bash-3.2$ month=08
    bash-3.2$ echo $(($month + 1))
    bash: 08: value too great for base (error token is "08")
    bash-3.2$ month=10#08
    bash-3.2$ echo $(($month + 1))
    9
    

    【讨论】:

      【解决方案3】:

      试试这个:

      MON=$(date +"%m")
      echo $(($MON-2))
      

      您不需要使用expr,因为 bash 也可以执行简单的算术运算。

      如果您的 shell 不支持算术表达式,请使用 expr:

      expr $MON - 2 
      

      在这两种情况下,您都会得到2 作为输出。

      【讨论】:

      • --2")语法错误:算术运算符无效(错误标记是“作为输出。这就是输出。
      • 您没有正确分配MON。如我的回答所示,使用MON=$(date +"%m")
      • @DeepeshShetty - 你用的是什么外壳?这个答案对于我尝试过的 shell 是正确的
      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2013-02-24
      • 2013-10-10
      相关资源
      最近更新 更多