Bash 继续<;n>;不跳过<;n>;在shell脚本中向前迭代

Bash 继续<;n>;不跳过<;n>;在shell脚本中向前迭代,bash,shell,unix,Bash,Shell,Unix,我在bash中为字符串创建了一个十六进制到ASCII的转换器。我使用的应用程序将字符串中的字符(除[0-9]、[A-Z]、[A-Z]之外的任何字符)更改为其对应的%十六进制。例如:更改为字符串中的%2F 我希望保留ASCII字符的原样。下面是我的代码: NAME=%2fhome%40%21%23 C_NAME="" for (( i=0; i<${#NAME}; i++ )); do CHK=$(echo "{NAME:$i:1}" | grep -v "\%" &>

我在bash中为字符串创建了一个十六进制到ASCII的转换器。我使用的应用程序将字符串中的字符(除[0-9]、[A-Z]、[A-Z]之外的任何字符)更改为其对应的%十六进制。例如:更改为字符串中的%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"
预期:

  /home@!#

因此,基本上,转换正在发生,但尚未到位。它还保留了十六进制值,这告诉我
continue 2
语句可能没有像我在代码中预期的那样工作。任何解决方法都可以。

您只有一个循环,因此我假设您希望
continue 2
跳过当前循环的当前和下一次迭代,但是,文档
help continue
清楚地说明了这一点

继续[n]
[…]
如果指定了N,则恢复第N个封闭循环


没有内置的跳过当前循环以及当前循环的下一次迭代的功能,但是在您的情况下,您可以使用
((i+=2))
而不是
继续2
,您只有一个循环,因此我假设您希望
继续2
跳过当前循环的当前和下一次迭代,文档
帮助继续
明确说明

继续[n]
[…]
如果指定了N,则恢复第N个封闭循环


没有内置的方法可以跳过当前循环以及当前循环的下一次迭代,但是在您的情况下,您可以使用
((i+=2))
而不是
继续2
,我非常喜欢您的练习,并决定用awk(我当前的研究)解决它

希望你也喜欢

cat script.awk

BEGIN {RS = "%[[:xdigit:]]+"} { # redefine record separtor to RegEx (gawk specific)
        decNum = strtonum("0x"substr(RT, 2)); # remove prefix # from record separator, convert hex num to dec
        outputStr = outputStr""$0""sprintf("%c", decNum); # reconstruct output string
}
END {print outputStr}
输出

echo %2fhome%40%21%23 |awk -f script.awk
/home@!#

我真的很喜欢你的练习,并决定用awk(我目前的研究)解决它

希望你也喜欢

cat script.awk

BEGIN {RS = "%[[:xdigit:]]+"} { # redefine record separtor to RegEx (gawk specific)
        decNum = strtonum("0x"substr(RT, 2)); # remove prefix # from record separator, convert hex num to dec
        outputStr = outputStr""$0""sprintf("%c", decNum); # reconstruct output string
}
END {print outputStr}
输出

echo %2fhome%40%21%23 |awk -f script.awk
/home@!#

使用脚本的结构并进行一些简化和更正:

#/bin/bash
名称=%2fhome%40%21%23
c_name=“”

对于((i=0;i使用脚本的结构进行一些简化和更正:

!/bin/bash
名称=%2fhome%40%21%23
c_name=“”
对于((i=0;i