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

问题描述 投票:0回答:2

假设我在变量

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

ls "$DIR"

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

DIR="/Users/Mick O'Neil (the \"Terminator\")/Desktop"
echo $DIR # prints /Users/Mick O'Neil (the "Terminator")/Desktop
ls <what should I write here?>
linux bash macos command-line
2个回答
6
投票

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

来自 Bash 引用手册

3.1.2.3 双引号

用双引号 ('"') 括起字符会保留引号内所有字符的字面值,但 '$'、'`'、'\' 和启用历史扩展时的 '!' 除外。


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

$ cat file
Mick O'Neil (the "Terminator")

读入变量:

$ filename=$(<file)

检查其值:

$ echo "$filename"
Mick O'Neil (the "Terminator")

使用此值创建一个文件:

$ touch "$filename"

检查已创建成功:

$ lt "$filename"
-rw-r--r-- 1 me me 0 Mar  1 15:09 Mick O'Neil (the "Terminator")

0
投票

正如 fedorqui 所写,双引号可以满足你的需求。

还值得注意的是,Bash 不会递归地计算值包含美元符号的变量的内容。 因此,例如:

#!/bin/bash

foo='My Do$$ar filename.txt'
bar='Renamed "My Do$$ar filename.txt".txt'

echo $foo
echo $bar

echo "Random content" > "$foo"
cp "$foo" "$bar"

会做你(可能)想做的事:

$ ls -l
total 16
-rw-r--r-- 1 foo bar  15 Aug 14 18:57 'My Do$$ar filename.txt'
-rw-r--r-- 1 foo bar  15 Aug 14 18:57 'Renamed "My Do$$ar filename.txt".txt'
© www.soinside.com 2019 - 2024. All rights reserved.