假设我在变量
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?>
引号不仅适用于空格,也适用于所有内容,因此使用双引号是您此处所需的安全级别。
来自 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")
正如 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'