bash - 继续不跳过在 shell 脚本中向前迭代
问题描述
我为 bash 中的字符串创建了一个十六进制到 ASCII 转换器。我正在使用的应用程序将字符串中的字符 (除了 [0-9],[AZ],[az]) 更改为其对应的 %hexadecimal。例如:/ 更改为字符串中的 %2F
我想按原样保留 ASCII 字符。下面是我的代码:
NAME=%2fhome%40%21%23
C_NAME=""
for (( i=0; i<${#NAME}; i++ )); do
CHK=$(echo "{NAME:$i:1}" | grep -v "\%" &> /dev/null;echo $?)
if [[ ${CHK} -eq 0 ]]; then
C_NAME=`echo "$C_NAME${NAME:$i:1}"`
else
HEX=`echo "${NAME:$i:3}" | sed "s/%//"`
C_NAME=`echo -n "$C_NAME";printf "\x$HEX"`
continue 2
fi
done
echo "$C_NAME"
输出:
/2fhome@40!21#23
预期的:
/home@!#
所以基本上转换正在发生,但没有到位。它也保留了十六进制值,这告诉我该continue 2
语句可能没有像我在代码中所期望的那样工作。请任何解决方法。
解决方案
使用脚本的结构进行一些简化和更正:
#!/bin/bash
name=%2fhome%40%21%23
c_name=""
for (( i=0; i<${#name}; i++ )); do
c=${name:i:1}
if [[ $c != % ]]; then
c_name=$c_name$c
else
hex=${name:i+1:2}
printf -v c_name "%s\x$hex" "$c_name"
(( i += 2 )) # stolen from Dudi Boy's answer
fi
done
echo "$c_name"
- 始终使用小写或混合大小写的变量,以避免名称与 shell 或环境变量发生冲突的机会
- 始终使用
$()
而不是反引号 - 您使用的大多数
echo
命令都不是必需的 - 您可以避免使用
sed
和grep
- 变量不应该包含在格式字符串中,
printf
但在这里不能轻易避免(echo -e "\x$hex"
尽管您可以使用) - 您可以在参数扩展中进行数学运算
%
不需要在您的grep
命令中转义- 如果您直接使用它的值,您可以消除该
$hex
变量:
printf -v c_name "%s\x${name:i+1:2}" "$c_name"
推荐阅读
- python - 按存储在字典中的固定宽度切片 DAT 文件
- javascript - JavaScript 按特定常量值对多个属性上的对象数组进行排序
- docusignapi - DocuSign REST API - 检索部分签名的文档
- c - 当我调试 C 程序时,我遇到了这个错误:PreLaunchTask 'C/C++:gcc.exe build active file' 以退出代码 -1 终止
- c - 大小为 1 Valgrind 的无效读取
- c - 检查队列是否为空
- javascript - HTML 文件无法编译
- javascript - php从带有json的url加载图像并显示
- php - PHP - 从文本文件中跳过 0D0A 行的问题
- c - Lex 字计数器未正常运行。打开文件可能出现问题