我在互联网上查找问题,但找不到答案。抱歉,如果之前已回答。这是给bash使用的。
所以我的脚本将读取一个input.dat文件,并将查找行并根据该行进行算术运算。示例:
#input.dat file:
205 - 12
0xFED - 0xABCD
使用代码echo $((p))
,其中p是循环计数(帮助我计算和打印每一行),但是0xFED-0xABCD返回-39904,但是我希望它返回其十六进制对应物。
./ test.sh input.dat
while read p; do
echo $((p))
done <$1
返回:
193
-39905
但是如果要对十六进制值进行计算,我希望它返回十六进制结果而不是十进制。
欢迎提出任何想法!
答案 0 :(得分:0)
使用printf
指定应如何打印输出。对于十六进制表示,可以使用%x
printf修饰符,对于十进制表示,可以使用%d
printf修饰符。
请勿复制以下代码,它将尝试删除驱动器上的所有文件。以下代码中的注释:
# for each line in input
# with leading and trailing whitespaces removed
while IFS=$' \r\n' read -r line; do
# ADD HERE: tokenization of line
# checking if it's valid and safe arithmetic expression
# run the arithemetical expansion on the line fetching the result
# this is extremely unsafe, equal to evil eval
if ! res=$((line)); then
echo "Arithmetical expansion on '$p' failed!"
exit 1
fi
# check if the line starts with `0x`
# leading whitespaces are removed, so we can just strip the leading two character
if [ "${p:0:2}" == "0x" ]; then
# if it does print the result as a hexadecimal
printf "%x\n" "$res"
else
printf "%d\n" "$res"
fi
# use heredoc for testing input
done <<EOF
205 - 12
0xFED - 0xABCD
0 $(echo "I can run any malicious command from here! Let's remove all your files!" >&2; echo rm -rf / )
EOF