Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 尝试添加“时出现语法错误”$&引用;在数字前面_Bash_Shell - Fatal编程技术网

Bash 尝试添加“时出现语法错误”$&引用;在数字前面

Bash 尝试添加“时出现语法错误”$&引用;在数字前面,bash,shell,Bash,Shell,我试图在下面计算的数字前面加一个“$”;唯一成功添加“$”的是限额,因为它与总额等没有任何数学冲突。我如何添加美元登录成本、小费、总额、平均值。我试图添加它,就像我对限制所做的那样,但它给了我一个语法错误。请帮我弄清楚 Percent=20 function calc { echo -n "What is the total cost in cents?"; read cents guests=5 Limit='$'$(awk "BEGIN{printf \"%.2f\n\",

我试图在下面计算的数字前面加一个“$”;唯一成功添加“$”的是限额,因为它与总额等没有任何数学冲突。我如何添加美元登录成本、小费、总额、平均值。我试图添加它,就像我对限制所做的那样,但它给了我一个语法错误。请帮我弄清楚

Percent=20
function calc {
  echo -n "What is the total cost in cents?";
  read cents
  guests=5
  Limit='$'$(awk "BEGIN{printf \"%.2f\n\", guests * 10  "); #added successfully
  Cost=$(echo "scale =2; $cents/100" | bc); #need to add $
  Percent=$(echo "scale =2; $Percent / 100" | bc);
  Tip=$(echo "scale =2; $Cost * $Percent" | bc); #need to add $
  Total=$(echo "scale =2; $Cost + $Tip" | bc); #need to add $
  Average=$(echo "scale =2; $Total/guests" | bc); #need to add $
}

我发布了一个类似的代码,但它不一样,因为前面的代码对我现在遇到的“$”问题没有帮助。简单的答案是,你可以通过引用或转义需要保护的部分来粘贴字符串,在本例中,它是
$
字符,否则它是shell元字符

Average=\$$(echo "scale =2; $Total/guests" | bc)  # or
Average='$'$(echo "scale =2; $Total/guests" | bc) # or
Average="$"$(echo "scale =2; $Total/guests" | bc)
您的实际问题似乎是,您在Awk中使用
guest
好像它是Awk变量,但Awk不知道shell有一个名为的变量

更重要的是,在子shell中运行大量的
echo
命令是一种反模式。您已经在使用Awk——重构它,使其一次生成所需的所有结果。也许是这样的:

Percent=20
calc () {   # notice also the switch to POSIX function definition syntax
  read -p "What is the total cost in cents?" cents
  # Can't use shell variable in Awk script!
  set -- $(awk -v guests=5 -v cents="$cents" -v percent="$Percent" '
    BEGIN{cost=cents/100; tip=cost*percent; total=cost+tip; average=total/guests;
        printf "%.2f $%.2f %.2f $%.2f $%.2f $%.2f\n", guests * 10,
            cost, percent/100, tip, total, average}')
  Limit=$1
  Cost=$2
  Percent=$3
  Tip=$4
  Total=$5
  Average=$6
}
set--some tokens
的功能是将
$1
设置为
some
$2
设置为
tokens
,等等,也就是说,这是一种将命令行参数设置为您选择的一组值的快速简洁(但可以说是模糊的)方法

您会注意到我在
printf
格式字符串中加入了美元符号


更重要的是,让一个函数创建大量变量以在shell脚本中的其他地方使用也是一种模糊但明显的坏味道。你确定这个脚本真的想成为shell脚本吗?你真的确定这个特殊的设计是可维护的吗?

简单的答案是,你可以通过引用或转义需要保护的部分来将字符串粘贴在一起,在本例中,这些部分是
$
字符,否则就是shell元字符

Average=\$$(echo "scale =2; $Total/guests" | bc)  # or
Average='$'$(echo "scale =2; $Total/guests" | bc) # or
Average="$"$(echo "scale =2; $Total/guests" | bc)
您实际的问题似乎是您在Awk中使用
guests
,就好像它是一个Awk变量一样,但是Awk不知道shell中有一个同名的变量

更重要的是,在子shell中运行大量的
echo
命令是一种反模式。您已经在使用Awk——重构它,使其一次生成所需的所有结果。也许是这样的:

Percent=20
calc () {   # notice also the switch to POSIX function definition syntax
  read -p "What is the total cost in cents?" cents
  # Can't use shell variable in Awk script!
  set -- $(awk -v guests=5 -v cents="$cents" -v percent="$Percent" '
    BEGIN{cost=cents/100; tip=cost*percent; total=cost+tip; average=total/guests;
        printf "%.2f $%.2f %.2f $%.2f $%.2f $%.2f\n", guests * 10,
            cost, percent/100, tip, total, average}')
  Limit=$1
  Cost=$2
  Percent=$3
  Tip=$4
  Total=$5
  Average=$6
}
set--some tokens
的功能是将
$1
设置为
some
$2
设置为
tokens
,等等,也就是说,这是一种将命令行参数设置为您选择的一组值的快速简洁(但可以说是模糊的)方法

您会注意到我在
printf
格式字符串中加入了美元符号


更重要的是,让一个函数创建大量变量以在shell脚本中的其他地方使用也是一种模糊但明显的坏味道。你确定这个脚本真的想成为shell脚本吗?你真的确定这个特定的设计是可维护的吗?

当你仍然使用变量来计算某些东西时,你不能将
$
添加到变量中。它用于
Limit
,因为
Limit
未在以下计算中使用。“手动”执行程序,看看会发生什么:

Cost='$12.00' # value computed by hand
Tip='$1.00'   # value computed by hand
Total=$(echo 'scale=2; $12.00 + $1.00' | bc); # filled in values of variables
发生了什么:

Cost='$12.00' # value computed by hand
Tip='$1.00'   # value computed by hand
Total=$(echo 'scale=2; $12.00 + $1.00' | bc); # filled in values of variables
bc
不知道如何处理
$
。在不使用
$
的情况下完成所有计算,然后(在最后)添加
$

# ongoing calculations
Cost='$'"$Cost"
Tip='$'"$Tip"
Total='$'"$Total"
Average='$'"$Average"

在仍然使用变量计算某些内容时,不能将
$
添加到变量中。它用于
Limit
,因为
Limit
未在以下计算中使用。“手动”执行程序,看看会发生什么:

Cost='$12.00' # value computed by hand
Tip='$1.00'   # value computed by hand
Total=$(echo 'scale=2; $12.00 + $1.00' | bc); # filled in values of variables
发生了什么:

Cost='$12.00' # value computed by hand
Tip='$1.00'   # value computed by hand
Total=$(echo 'scale=2; $12.00 + $1.00' | bc); # filled in values of variables
bc
不知道如何处理
$
。在不使用
$
的情况下完成所有计算,然后(在最后)添加
$

# ongoing calculations
Cost='$'"$Cost"
Tip='$'"$Tip"
Total='$'"$Total"
Average='$'"$Average"

您是否发现
成本='$'$(echo“scale=2;$cents/100”| bc)有任何问题#需要添加$
?是的,这是我从终端上得到的(标准中)1:非法字符:$(标准中)1:非法字符:$(标准中)2:语法错误(标准中)1:语法错误
成本='$'$(echo“scale=2;美分/100”| bc)在我的系统上工作。首先计算所有代码,并在所有计算完成后将其前缀为
$
。首先,计算所有代码,而不使用任何打印装饰,如
$
。最后,在打印过程中,您可以使用类似于
echo“Total Cost=\$$Cost”
的方法打印它。您是否发现
Cost='$'$(echo“scale=2;$cents/100”| bc)有任何问题#需要添加$
?是的,这是我从终端上得到的(标准中)1:非法字符:$(标准中)1:非法字符:$(标准中)2:语法错误(标准中)1:语法错误
成本='$'$(echo“scale=2;美分/100”| bc)在我的系统上工作。首先计算所有代码,并在所有计算完成后将其前缀为
$
。首先,计算所有代码,而不使用任何打印装饰,如
$
。最后,在打印过程中,您可以使用类似于
echo“Total Cost=\$$Cost”的内容来打印它
相关设计是让Awk输出一段shell脚本并将其传递给
eval
,但我们希望避免
eval
,因为如果使用不当,它可能会造成一个重大的安全漏洞。相关设计是让Awk输出一段shell脚本并将其传递给
eval
,但我们喜欢避免
eval
,因为如果使用错误,它有可能创建一个重要的安全漏洞。