How can I do ANSI C quoting of an existing bash variable?

梦想与她 提交于 2019-12-07 09:56:26

问题


I have looked at this question, but it does not cover my use case.

Suppose I have the variable foo which holds the four-character literal \x60.

I want to perform ANSI C Quoting on the contents of this variable and store it into another variable bar.

I tried the following, but none of them achieved the desired effect.

bar=$'$foo'   
echo $bar     
bar=$"$foo"     
echo $bar       

Output:

$foo
\x61

Desired output (actual value of \x61):

a

How might I achieve this in the general case, including non-printable characters? Note that in this case a was used just as an example to make it easier to test whether the method worked.


回答1:


By far the simplest solution, if you are using bash:

printf %b "$foo"

Or, to save it in another variable name bar:

printf -v bar %b "$foo"

From help printf:

In addition to the standard format specifications described in printf(1) and printf(3), printf interprets:

 %b        expand backslash escape sequences in the corresponding argument
 %q        quote the argument in a way that can be reused as shell input
 %(fmt)T output the date-time string resulting from using FMT as a format
         string for strftime(3)

There are edge cases, though:

\c terminates output, backslashes in \', \", and \? are not removed, and octal escapes beginning with \0 may contain up to four digits




回答2:


The best method I know is

  y=$(printf $(echo "$foo"|sed 's/%/%%/g'))

As mentioned in the comments, this trims trailing newlines from $foo. To overcome this:

moo=$(echo "${foo}:end"|sed 's/%/%%/g')
moo=$(printf "$moo")
moo=${moo%:end}
# the escaped string is in $moo
echo "+++${moo}---"



回答3:


I just found out that I can do this. Edited based on comments.

bar=$( echo -ne "$foo" )



回答4:


The following works:

 eval bar=\$\'$x\'

The command bar=$'\x61' has to be constructed first, then eval evaluates the newly built command.




回答5:


Sample of conversion via shell. Problem, the code is octal using \0nnn and hexdecimal (not on all shell) using \xnn (where n are [hexa]digit)

foo="\65"
print "$( echo "$foo" | sed 's/\\/&0/' )"

5

with awk, you could certainly convert it directly




回答6:


Since bash 4.4 there is a variable expansion to do exactly that:

$ foo='\x61';     echo "$foo" "${foo@E}"
\x61 a

To set another variable use:

$ printf -v bar "${foo@E}";     echo "$bar"
a


来源:https://stackoverflow.com/questions/23235651/how-can-i-do-ansi-c-quoting-of-an-existing-bash-variable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!