例如,$PATH和$HOME
当我输入时,echo $PATH它返回 my $PATH,但我想回显这个词$PATH而不是实际变量代表的内容,echo "$PATH"也不起作用。
我想使用 echo 命令和重定向运算符创建一个文件,该文件应该由几行组成。
我试图通过“\n”在字符串中包含一个换行符:
echo "first line\nsecond line\nthirdline\n" > foo
Run Code Online (Sandbox Code Playgroud)
但是这样不会创建三行文件,而是创建一个只有一行和字符串的逐字内容的文件。
如何仅使用此命令创建多行文件?
这个问题不是关于如何编写正确转义的字符串文字。我找不到任何与如何转义变量以在脚本或其他程序中直接使用的相关问题。
我的目标是使脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台机器上运行 0 到n次,并且生成它们的数据在运行(再次)之前可能会发生变化,因此直接通过网络执行操作将不行。
给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,foo包含的变量bar'baz应出现在生成的脚本中:
qux='bar'\''baz'
Run Code Online (Sandbox Code Playgroud)
这将通过附加"qux=$foo_esc"到其他脚本行来编写。我是这样使用 Perl 做到的:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
Run Code Online (Sandbox Code Playgroud)
但这似乎有点矫枉过正。
我单独使用 bash 没有成功。我已经尝试了这些的许多变体:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
Run Code Online (Sandbox Code Playgroud)
但是输出中会出现额外的斜杠(当我这样做时echo "$foo"),或者它们会导致语法错误(如果从 shell 完成,则需要进一步的输入)。
由于多年前被纠正,我从反引号切换到 $() 以进行命令扩展。
但我还是更喜欢反引号。它是更少的击键并且不涉及Shift键。
我知道括号更可取,因为它不太容易出现反引号容易出现的错误,但是规则从不使用反引号的原因是什么?
我想在 bash 脚本完成后输出它。
/\_/\
( o.o )
> ^ <
Run Code Online (Sandbox Code Playgroud)
我已尝试以下但所有返回错误。
echo /\\_/\\\n\( o.o \)\n > ^ <
echo \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <
Run Code Online (Sandbox Code Playgroud)
如何转义这些字符以便 bash 将它们呈现为字符串?
假设$file持有一个文件名的值,比如Dr' A.tif. 在 bash 编程中,如何在$file不删除特殊字符的情况下转义单引号和任何其他特殊字符?
2014 年 7 月 9 日更新
根据@Gilles 的请求,以下代码片段无法处理Dr' A.tif:
files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}
Run Code Online (Sandbox Code Playgroud)
在我尝试了@Patrick on的答案后line 1,它似乎对我有用。但是,如果我有诸如Dr\^s A.tif,printf命令之类的文件,它似乎没有帮助,它会向我显示Dr\^s\ A.tif. 如果我像这样在控制台上手动尝试:
printf "%q" "Dr\^s A.tif"
我会有这个输出:
Dr\\\^s\ A.tif
知道如何处理吗?
我有基于浏览器的 shell/终端来执行 bash 命令,我正在转义空格,但事实证明括号也需要转义。对于不在引号中的文件名,还需要对哪些其他字符进行转义?
我创建了一个名为“$pattern”的目录,现在每当我尝试删除它时,它都会说
模式:未定义的变量。
我试过了:
$ rm -r $pattern
$ rm -rf $pattern
$ rm "$ option[value='2016']"
Run Code Online (Sandbox Code Playgroud) 我想澄清一下,我不是在谈论如何在解释的 shell 级别上转义字符。
据我所知,只需要转义两个字符:%和\
要打印文字%,您必须使用前面的 将其转义%:
printf '%%'
Run Code Online (Sandbox Code Playgroud)
要打印文字,\您必须使用前面的 将其转义\:
printf '\\'
Run Code Online (Sandbox Code Playgroud)
是否有任何其他情况我需要转义字符才能按字面意思解释?
我一直使用单引号进行字段分隔,例如: awk -F';' ...
对我来说很新的是使用反斜杠的方式,如: awk -F\; ...
两者是否存在技术差异,还是只是偏好问题?