【问题标题】:Avoid expansion of * in bash builtin function let避免在 bash 内置函数 let 中扩展 *
【发布时间】:2010-09-27 05:35:24
【问题描述】:

我的 bash 脚本有问题。我必须使用运算符 * 进行乘法运算。相反,该脚本通过扩展和使用脚本本身的名称作为运算符来困扰我。我尝试使用单引号,但它不起作用:(这是代码

#!/bin/bash -x

# Bash script that calculates an arithmetic expression
# NO PRECEDENCE FOR OPERATORS
# Operators: + - * 

if [ "$#" -lt "3" ]
then 
    echo "Usage: ./calcola.scr <num> <op> <num> ..."
    exit 1
fi

result=0
op=+
j=0

for i in "$@"
do
    if [ "$j" -eq "0" ]
    then
        # first try
        #result=$(( $result $op $i )) 

        # second try
        let "result$op=$i"

        j=1
    else
        op=$i
        j=0
    fi
done

echo "Result is $result"

exit 0

【问题讨论】:

    标签: bash scripting expansion let


    【解决方案1】:

    如果 "op" 是 "*",它会在你的脚本看到它之前被 shell 扩展。您需要为乘法运算符选择其他内容,例如“x”,或者通过将其放在单引号中或在其前面加上反斜杠来强制用户对其进行转义。

    如果练习的条件允许,也许你应该尝试使用“read”从标准输入中获取表达式,而不是从命令行获取它们。

    【讨论】:

    • 这可能是个好主意,但我必须让用户使用 * 而不是转义形式.. :( 因为本练习的目标是使用 *
    【解决方案2】:

    它有效,你只是没有正确地转义*。尝试使用反斜杠:

    $ ./calcola.scr 2 \* 3
    + '[' 3 -lt 3 ']'
    + result=0
    + op=+
    + j=0
    + for i in '"$@"'
    + '[' 0 -eq 0 ']'
    + let result+=2
    + j=1
    + for i in '"$@"'
    + '[' 1 -eq 0 ']'
    + op='*'
    + j=0
    + for i in '"$@"'
    + '[' 0 -eq 0 ']'
    + let 'result*=3'
    + j=1
    + echo 'Result is 6'
    Result is 6
    + exit 0
    $
    

    尽管像 Paul Tomblin mentioned 一样,使用 x 作为乘法运算符可能会更好。

    【讨论】:

    • 是的,代码使用转义 * .. 我不知道.. 问题可能出在练习的要求中。顺便说一句谢谢。 :)
    【解决方案3】:

    如果您的脚本根本不需要“* 扩展”(通常称为“通配符”),只需以“-f”开头即可;您也可以在运行时更改它:

    mat@owiowi:/tmp/test$ echo *
    A B
    mat@owiowi:/tmp/test$ set -f
    mat@owiowi:/tmp/test$ echo *
    *
    mat@owiowi:/tmp/test$ set +f
    mat@owiowi:/tmp/test$ echo *
    A B
    

    【讨论】:

    • 我尝试在脚本中使用它,但它不起作用.. :( 这是因为在运行脚本之前必须调用命令'set -f'。我可以' t 避免扩展,因为它是在脚本启动时完成的。
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2020-06-24
    • 2023-03-07
    • 2019-08-30
    • 2021-03-25
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多