在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
2条答案
按热度按时间kg7wmglp1#
对于 * defining * 示例中的特定字符串
Apparel & Accessories > Clothing > Activewear
,* 双引号 * 或 * 单引号都可以;然而,后来提到它的情况就不同了:在 shell(任何与POSIX兼容的shell)中,如何 * 引用 * 变量与如何 * 定义 * 它一样重要。
要安全地 * 引用 * 以前定义的变量而不产生副作用, 请将其用双引号引起来 ,例如
"$directory"
。若要 * 定义*[变数为]常值(逐字)字串:
(By相反,要定义具有 * 嵌入式变量引用 * 或 * 嵌入式命令替换 * 或 * 嵌入式算术表达式 * 的变量,请使用 * 双 * 引号(
"
)。)*使用单引号字符串,例如:
单引号字符串不受shell的任何解释的影响,因此它通常是定义 literal的最安全的选项。例如:
I'm here.
),并且您想要一个在 * 所有 * POSIX兼容shell中都有效的解决方案:*将字符串拆分为多个(单引号)部分,并 * 用 * 单引号字符进行拼接:
注:遗憾的是,* 单引号字符串不能包含单引号,即使带有转义 * 也不行。
该字符串被分解为单引号的
I
,后跟文字'
(转义为 * 无引号 * 字符串,如\'
),后跟单引号的m here.
。由于各部分之间没有空格,因此结果是一个 single 字符串,在I
之后包含文字单引号。备选方案:如果您 * 不介意使用多行语句 *,您可以使用 * 在此处引用的文档 *,如底部所述。
I'm here.
),并且您需要一个**适用于bash
、ksh
和zsh
**的解决方案:注意:如您所见,ANSI-C引号允许将单引号转义为
\'
,但请注意其他含义:其它**\<char>
序列也要进行解释**;例如,\n
被解释为换行符-请参阅http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting@chepner的建议,他指出,在要使用的字符串中直接包含单引号的POSIX兼容方法 * 逐字是使用
read -r
和使用 * 引号 * 开头分隔符**的here文档(-r
选项确保字符串中的\
字符被视为文字)。read
读取该输入)。因此,您不能使用此技术直接将结果字符串作为 argument 传递。8yoxcaq72#
使用强引号,例如'string',允许字符串使用转义字符或特殊字符
在声明变量时,使用declare也是一个很好的做法。