引用包含引号并在 Bash 中作为变量给出的文件名

Aiv*_*var 2 linux macos bash command-line

假设我有一个变量目录路径DIR,我想列出该目录。如果我只关心路径中的空格,那么我可以这样做

ls "$DIR"
Run Code Online (Sandbox Code Playgroud)

如果我想在目录路径中也支持单引号和双引号以及其他奇怪的东西,我应该写什么?例子:

DIR="/Users/Mick O'Neil (the \"Terminator\")/Desktop"
echo $DIR # prints /Users/Mick O'Neil (the "Terminator")/Desktop
ls <what should I write here?>
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 5

引号不仅适用于空格,也适用于所有内容,因此使用双引号是您此处所需的安全级别。

\n

来自Bash 引用手册

\n
\n

3.1.2.3 双引号

\n

将字符括在双引号 (\xe2\x80\x98"\xe2\x80\x99) 中会保留引号内所有字符的字面值,但 \xe2\x80\x98$\xe2\x80\x99、\ 除外xe2\x80\x98`\xe2\x80\x99、\xe2\x80\x98\\\xe2\x80\x99,当启用历史扩展时,\xe2\x80\x98!\xe2\x80\x99。

\n
\n
\n

让我们将此字符串存储到文件中以供以后使用。

\n
$ cat file\nMick O\'Neil (the "Terminator")\n
Run Code Online (Sandbox Code Playgroud)\n

读入变量:

\n
$ filename=$(<file)\n
Run Code Online (Sandbox Code Playgroud)\n

检查其值:

\n
$ echo "$filename"\nMick O\'Neil (the "Terminator")\n
Run Code Online (Sandbox Code Playgroud)\n

创建一个具有该值的文件:

\n
$ touch "$filename"\n
Run Code Online (Sandbox Code Playgroud)\n

检查是否创建成功:

\n
$ lt "$filename"\n-rw-r--r-- 1 me me 0 Mar  1 15:09 Mick O\'Neil (the "Terminator")\n
Run Code Online (Sandbox Code Playgroud)\n