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
,因为如果使用错误,它有可能创建一个重要的安全漏洞。