shell中有一个方法可以忽略转义字符吗?

时间:2014-05-13 01:50:14

标签: shell escaping

在C#中,有一个逐字字符串,

string c = "hello \t world";               // hello     world
string d = @"hello \t world";              // hello \t world

我是shell脚本的新手,shell中是否有类似的方法?

因为我有许多文件夹,其名称如“Apparel& Accessories> Clothing> Activewear”,所以我想知道是否有一种简单的方法可以处理转义字符而无需写入这么多。

test.sh

director="Apparel & Accessories > Clothing > Activewear"
# any action to escape spaces, &, >   ???
hadoop fs -ls $director

2 个答案:

答案 0 :(得分:3)

对于定义示例中的特定字符串,Apparel & Accessories > Clothing > Activewear 双引号单引号将起作用; 稍后提及是一个不同的故事,但是:

shell (任何与POSIX兼容的shell)中,引用到变量的方式与定义的方式一样重要 it。

要安全引用到之前定义的没有副作用的变量,将其用双引号括起来,例如"$directory"

定义 [变量为] 文字(逐字)字符串

(相反,要使用嵌入式变量引用嵌入式命令替换嵌入式算术表达式定义变量,请使用 double 引用(")。)

  • 如果您的字符串包含 NO 引号

    • 使用单引号字符串,例如:

      directory='Apparel & Accessories > Clothing > Activewear'
      

单引号字符串不受shell的任何解释,因此通常是定义文字 最安全的选项。请注意,字符串可能跨越多行; e.g:

        multiline='line 1
        line 2'
  • 如果您的字符串包含引号(例如I'm here.)并且您想要一个中工作的解决方案所有 POSIX兼容的shell

    • 将字符串分成多个(单引号)部分,拼接单引号字符

注意:遗憾的是,单引号字符串不能包含单引号,即使转义也不能。

        directory='I'\''m here.' 

字符串分为单引号I,后跟文字'(作为未加引号的字符串转义为\'),后跟单个引用m here.。由于部件之间没有空格,因此结果是单个字符串,其中包含I之后的文字单引号。

替代方案:如果您不介意使用多行语句,则可以使用引用此处的文档,如底部所述。

  • 如果您的字符串包含引号(例如I'm here.),并且您想要一个在{{1>中工作的解决方案}},bashksh

    • 使用 ANSI-C引用

      zsh

注意:正如您所看到的,ANSI-C引用允许将单引号转义为directory=$'I\'m here.' ,但请注意其他含义:其他 \'序列是还有解释;例如,\<char>被解释为换行符 - 请参阅http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting


对@chepner的提示,他指出 POSIX兼容的方式直接包含要在 verbatim 中使用 verbatim 的字符串中的单引号 \n here document使用引用的开场分隔符read -r选项可确保字符串中的-r个字符被视为文字)。

\
  • 请注意,此处文档创建 stdin 输入(在这种情况下# *Any* form of quoting, not just single quotes, on the opening EOF will work. # Note that $HOME will by design NOT be expanded. # (If you didn't quote the opening EOF, it would.) read -r directory <<'EOF' I'm here at $HOME EOF 读取)。因此,您无法使用此技术直接将生成的字符串作为参数传递。

答案 1 :(得分:2)

使用强引号,即&#39; string&#39;,允许使用转义字符或字符串的特殊字符。

e.g. declare director='Apparel & Accessories > Clothing > Activewear'
     

在声明变量时也使用声明是一种很好的做法。