linux 在使用printf时,如何在shell脚本中转义特殊字符?

b1payxdu  于 2022-12-22  发布在  Linux
关注(0)|答案(4)|浏览(172)

我正在尝试在shell中使用printf化字符串,我将从文件中获取输入字符串,其中包含%,',"",,\user, \tan等特殊字符。
如何转义输入字符串中的特殊字符?
埃格

#!/bin/bash
# 

string='';
function GET_LINES() {

   string+="The path to K:\Users\ca, this is good";
   string+="\n";
   string+="The second line";
   string+="\t";
   string+="123"
   string+="\n";
   string+="It also has to be 100% nice than %99";

   printf "$string";

}

GET_LINES;

我期待这将打印在我想要的格式一样

The path to K:\Users\ca, this is good
The second line   123
It also has to be 100% nice than %99

但它会产生意想不到的结果

./script: line 14: printf: missing unicode digit for \U
The path to K:\Users\ca, this is good
The second line 123
./script: line 14: printf: `%99': missing format character
It also has to be 100ice than

那么我怎样才能在打印的时候去掉特殊字符呢?echo -e也有这个问题。

jgzswidk

jgzswidk1#

试试看

printf "%s\n" "$string"

参见printf(1)

nukf8bse

nukf8bse2#

请允许我指出,“man printf”清楚地表明,“%”字符必须通过另一个“%”进行转义,因此printf“%%”将导致单个“%”

eivnm1vs

eivnm1vs3#

为了方便那些在Google搜索"bash printf escaped"后通过单击第一个搜索结果到达此处的人,printf使用%q化程序来生成bash转义的文本。
例如:

$ printf "<<%q>>\n" 'foe fum' "fee fie"$'\n'
<<foe\ fum>>
<<$'fee fie\n'>>

man printf开始:

%q     ARGUMENT is printed in a format that can be reused as shell
       input,  escaping  non-printable  characters with the 
       proposed POSIX $'' syntax.
njthzxwz

njthzxwz4#

你可以使用$' '来包含换行符和制表符,然后一个普通的echo就足够了:

#!/bin/bash 

get_lines() {    
   local string
   string+='The path to K:\Users\ca, this is good'
   string+=$'\n'
   string+='The second line'
   string+=$'\t'
   string+='123'
   string+=$'\n'
   string+='It also has to be 100% nice than %99'

   echo "$string"
}

get_lines

我还对脚本做了一些其他的小改动。除了将FUNCTION_NAME小写之外,我还使用了更广泛兼容的函数语法。在这种情况下,没有太多的优势(因为$' '字符串是bash的扩展),但据我所知,没有理由使用function func()语法。string的作用域也可以是使用它的函数的局部,所以我也修改了它。
输出:

The path to K:\Users\ca, this is good
The second line 123
It also has to be 100% nice than %99

相关问题