shell中有没有忽略转义字符的方法?

Fre*_*Ren 1 shell escaping

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

string c = "hello \t world";               // hello     world
string d = @"hello \t world";              // hello \t world
Run Code Online (Sandbox Code Playgroud)

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

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

test.sh

director="Apparel & Accessories > Clothing > Activewear"
# any action to escape spaces, &, >   ???
hadoop fs -ls $director
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

为了定义示例中的特定字符串,Apparel & Accessories > Clothing > Activewear可以使用引号或单引号;然而,稍后提及它则是另一回事了:

shell(任何 POSIX 兼容 shell)中,如何引用变量与如何定义变量同样重要。

要安全地引用先前定义的变量而不产生副作用,请将其括在双引号中,例如"$directory"

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

(相比之下,要定义具有嵌入变量引用嵌入命令替换嵌入算术表达式的变量,请使用引号 ( ")。)

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

        multiline='line 1
        line 2'
Run Code Online (Sandbox Code Playgroud)
  • 如果您的字符串 确实包含引号(例如, )并且您想要一个适用所有POSIX 兼容 shell 的I'm here.解决方案:

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

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

        directory='I'\''m here.' 
Run Code Online (Sandbox Code Playgroud)

该字符串被分成单引号I,后跟文字'(转义为不带引号的字符串\'),后跟单引号m here.。由于各部分之间没有空格,结果是在 后包含一个文字单引号的单个字符串I

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

  • 如果您的字符串 确实包含引号(例如,I'm here.)并且您想要一个适用于bashksh和 的zsh解决方案:

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


向@chepner致敬,他指出,直接在要逐字使用的字符串中包含单引号的 POSIX 兼容方式read -r与使用带引号的开始定界符的此处文档一起使用(该选项-r确保\字符串被视为文字)。

# *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
Run Code Online (Sandbox Code Playgroud)
  • 请注意,此处文档创建标准输入(read在本例中读取)。因此,您不能使用此技术直接将结果字符串作为参数传递。