shell 显示百分数

awk 'BEGIN{printf "%.2f%\n",'$a'/'$b'*100}' 



echo `echo "scale=2;$a/6"|bc`%



awk 'BEGIN{printf "%.2f%\n",'$a'/'$b'*100}' 



echo `echo "scale=2;$a/6"|bc`%



 shell计算中使用除法,基本默认上都是整除。

比如:

num1=2

num2=3

num3=`expr $num1 / $num2`

这个时候num3=0 ,是因为是因为expr不支持浮点除法

解决的方法:

num3=`echo "sclae=2; $num1/$num2" | bc`

使用bc工具,sclae控制小数点后保留几位

还有一种方法

awk 'BEGIN{printf "%.2f\n",’$num1‘/’$num2‘}'

如果用百分比表示

awk 'BEGIN{printf "%.2f%\n",(’$num1‘/’$num2‘)*100}'



<think>我们参考了多个关于Shell脚本实现进度条的引用,总结出几种常见的实现方式: 1. 静态进度条(固定字符重复打印) 2. 动态旋转进度条(使用|/-\等字符模拟旋转) 3. 百分比进度条(显示完成百分比) 4. 多彩进度条(使用ANSI颜色代码) 5. 多层进度条(同时显示多个进度条) 我们将分别介绍这些方法的实现思路和示例代码。 一、静态进度条(固定字符重复) 最简单的方式是重复打印同一个字符(如'#')来表示进度,并配合回车符(\r)实现原地刷新。 示例代码(引用[2]的简化): ```bash #!/bin/bash total=50 for ((i=1; i<=$total; i++)); do printf "[%-50s] %d%%\r" $(printf "%0.s#" $(seq 1 $i)) $((i*2)) sleep 0.1 done echo ``` 二、动态旋转进度条 使用四个字符(|, /, -, \)循环显示,模拟旋转效果(引用[3][5])。 示例代码(引用[3]的简化): ```bash #!/bin/bash function show_spinner { local -r pid=$1 local -r delay=0.1 local spinstr='|/-\' while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do local temp=${spinstr#?} printf "[%c] " "$spinstr" local spinstr=$temp${spinstr%"$temp"} sleep $delay printf "\b\b\b\b" done printf " \b\b\b\b" } (sleep 5) & # 后台执行一个长时间的任务 show_spinner $! # 将后台任务的PID传入 echo "Done" ``` 三、百分比进度条 结合进度百分比和进度条长度,动态显示(引用[2][4])。 示例代码(引用[2]的修改): ```bash #!/bin/bash total=100 for ((i=1; i<=total; i++)); do percent=$((i*100/total)) completed=$((i*50/total)) # 假设进度条长度为50个字符 remaining=$((50-completed)) # 构建进度条字符串 bar=$(printf "%0.s#" $(seq 1 $completed)) if [ $remaining -gt 0 ]; then bar=$(printf "%s%0.s " "$bar" $(seq 1 $remaining)) fi printf "\r[%s] %d%%" "$bar" "$percent" sleep 0.1 done echo ``` 四、多彩进度条 使用ANSI转义序列设置颜色(引用[1])。 例如,设置红色字体:`echo -e "\033[31m Hello World \033[0m"` 其中,\033[31m表示红色,\033[0m表示重置样式。 我们可以将进度条加上颜色: ```bash #!/bin/bash total=100 for ((i=1; i<=total; i++)); do percent=$((i*100/total)) completed=$((i*50/total)) # 构建进度条字符串,并设置颜色(例如:绿色) bar=$(printf "\033[42m%0.s \033[0m" $(seq 1 $completed)) # 剩余部分用空格(背景色为默认) remaining=$((50-completed)) if [ $remaining -gt 0 ]; then bar="$bar$(printf "%0.s " $(seq 1 $remaining))" fi printf "\r[%s] \033[32m%d%%\033[0m" "$bar" "$percent" sleep 0.1 done echo ``` 五、多层进度条 使用tput控制光标位置,在终端的不同行输出多个进度条(引用[4])。 示例代码(引用[4]的简化): ```bash #!/bin/bash function process_bar() { local line=$1 local percent=$2 local str="" for ((k=1; k<=percent; k++)); do str+='#' done # 将光标移动到指定行 tput cup $line 0 # 打印进度条 printf "[%-100s][%d%%]\r" "$str" "$percent" } # 初始化tput,清屏并预留5行 tput init clear for i in {1..5}; do echo done # 模拟三个任务同时进行 for ((i=1; i<=100; i++)); do sleep 0.01 # 更新三个进度条,分别在第1、2、3行 process_bar 1 "$i" process_bar 2 "$((i/2))" # 第二个进度条速度减半 process_bar 3 "$((i/4))" # 第三个进度条速度为四分之一 done tput cup 5 0 echo "安装完成" ``` 注意事项: 1. 在进度条更新时,使用`\r`(回车)将光标移到行首,实现单行刷新。 2. 对于多层进度条,使用`tput`控制光标位置(注意:`tput`可能在某些终端不支持)。 3. 颜色控制代码需要终端支持ANSI转义序列。 根据需求选择合适的进度条样式。上述代码示例可以直接使用或根据实际情况修改。 §§相关问题§§ 1. 如何调整Shell进度条的刷新速度? 2. 如何在进度条显示的同时输出其他信息而不打乱进度条? 3. Shell进度条在哪些情况下无法正常显示? </think>在Shell脚本中实现进度条显示有多种方法,以下是常见的实现方式及相关代码示例: ### 一、基础百分比进度条 使用`#`符号填充并显示完成百分比(引用[2]): ```bash #!/bin/bash show_progress() { local progress=$1 total=$2 local percent=$((progress*100/total)) local bar=$(printf "%${percent}s" | tr ' ' '#') printf "\r[%-100s] %d%%" "$bar" "$percent" } total=50 for ((i=1; i<=total; i++)); do sleep 0.1 # 模拟任务执行 show_progress $i $total done echo -e "\n任务完成" ``` **特点**: - 动态更新百分比 - 进度条长度固定为100字符 - 使用`\r`实现行内刷新 ### 二、旋转动画进度条 适用于未知时长的任务(引用[3][5]): ```bash #!/bin/bash spinner() { local spin=('|' '/' '-' '\\') while :; do for char in "${spin[@]}"; do printf "\r处理中... %s" "$char" sleep 0.1 done done } # 启动动画 spinner & pid=$! # 执行实际任务 sleep 5 # 替换为实际命令 # 停止动画 kill $pid printf "\r任务完成!\n" ``` ### 三、多彩进度条 添加ANSI颜色代码(引用[1]): ```bash #!/bin/bash # 颜色定义 RED='\033[41;37m' GREEN='\033[42;30m' NC='\033[0m' # 重置颜色 for i in {1..100}; do sleep 0.05 # 根据进度切换颜色 if [ $i -lt 30 ]; then color=$RED elif [ $i -lt 70 ]; then color="\033[43;30m" else color=$GREEN fi printf "${color}\r[%-100s]%d%%${NC}" $(printf "%${i}s" | tr ' ' '=') $i done echo ``` ### 四、多层进度条 同时显示多个进度(引用[4]): ```bash #!/bin/bash progress_bar() { tput cup $1 0 # 定位到指定行 printf "[%-100s] %d%%" $(printf "%${2}s" | tr ' ' '#') $2 } # 初始化屏幕 clear echo -e "下载:\n解压:\n安装:" for i in {1..100}; do # 更新不同行进度 progress_bar 1 $((i/2)) progress_bar 2 $((i/3)) progress_bar 3 $i sleep 0.05 done tput cup 4 0 echo "全部完成!" ``` ### 关键实现技术 1. **光标控制**: - `\r`:回车符(不换行) - `tput cup`:精确光标定位(引用[4]) 2. **颜色控制**: - 格式:`\033[背景色;前景色m` - 示例:`\033[42;37m`绿色背景白字(引用[1]) 3. **动态刷新**: - 使用后台进程执行动画(引用[3][5]) - 通过`kill $PID`终止动画 > **注意事项**: > 1. 确保终端支持ANSI转义序列 > 2. 复杂进度条建议使用`tput`代替直接输出控制符 > 3. 长时间任务需考虑进度计算精度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值