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

zrfyljdw  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(231)

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

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

我是shell脚本新手,shell中是否有类似的方法?
因为我有很多文件夹的名字像“服装&配件〉服装〉运动服”,我想知道是否有一个简单的方法来处理转义字符没有写这么多。

test.sh

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

kg7wmglp1#

对于 * defining * 示例中的特定字符串Apparel & Accessories > Clothing > Activewear,* 双引号 * 或 * 单引号都可以;然而,后来提到它的情况就不同了:

shell(任何与POSIX兼容的shell)中,如何 * 引用 * 变量与如何 * 定义 * 它一样重要。
要安全地 * 引用 * 以前定义的变量而不产生副作用, 请将其用双引号引起来 ,例如"$directory"
若要 * 定义*[变数为]常值(逐字)字串

(By相反,要定义具有 * 嵌入式变量引用 * 或 * 嵌入式命令替换 * 或 * 嵌入式算术表达式 * 的变量,请使用 * 双 * 引号(")。)

  • 如果字符串包含NO * 单 * 引号
    *使用单引号字符串,例如:
directory='Apparel & Accessories > Clothing > Activewear'

单引号字符串不受shell的任何解释的影响,因此它通常是定义 literal的最安全的选项。例如:

multiline='line 1
        line 2'
  • 如果您的字符串确实包含 * 单 * 引号(例如,I'm here.),并且您想要一个在 * 所有 * POSIX兼容shell中都有效的解决方案:
    *将字符串拆分为多个(单引号)部分,并 * 用 * 单引号字符进行拼接:

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

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

该字符串被分解为单引号的I,后跟文字'(转义为 * 无引号 * 字符串,如\'),后跟单引号的m here.。由于各部分之间没有空格,因此结果是一个 single 字符串,在I之后包含文字单引号。
备选方案:如果您 * 不介意使用多行语句 *,您可以使用 * 在此处引用的文档 *,如底部所述。

  • 如果您的字符串确实包含 * 单 * 引号(例如I'm here.),并且您需要一个**适用于bashkshzsh**的解决方案:
  • 使用ANSI-C报价
directory=$'I\'m here.'

注意:如您所见,ANSI-C引号允许将单引号转义为\',但请注意其他含义:其它**\<char>序列也要进行解释**;例如,\n被解释为换行符-请参阅http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting
@chepner的建议,他指出,在要使用的字符串中直接包含单引号的POSIX兼容方法 * 逐字是使用read -r和使用 * 引号 * 开头分隔符**的here文档(-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
  • 请注意,这里的文档创建 stdin 输入(在本例中read读取该输入)。因此,您不能使用此技术直接将结果字符串作为 argument 传递。
8yoxcaq7

8yoxcaq72#

使用强引号,例如'string',允许字符串使用转义字符或特殊字符

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

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

相关问题