bash 脚本中变量的空格

kma*_*729 5 bash shell-script quoting variable-substitution

我在其中一个目录名称中有一个空格。我想从 bash 脚本中列出它下的一个文件。这是我的脚本:

fpath="${HOME}/\"New Folder\"/foobar.txt"

echo "fpath=(${fpath})"
#fpath="${HOME}/${fname}"

ls "${fpath}"
Run Code Online (Sandbox Code Playgroud)

此脚本的输出是:

fpath=(/Users/<username>/"New Folder"/foobar.txt)
ls: /Users/<username>/"New Folder"/foobar.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是什么时候在我的 shell 上列出它存在的文件:

$ ls /Users/<username>/"New Folder"/foobar.txt
/Users/<username>/New Folder/foobar.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法ls从我的脚本中显示路径?

Jam*_*ger 7

只需删除内部引用的双引号:

fpath="${HOME}/New Folder/foobar.txt"
Run Code Online (Sandbox Code Playgroud)

由于完整的变量内容包含在双引号中,因此您不需要第二次这样做。它从 CLI 工作的原因是 Bash 首先评估引号。它在变量中失败,因为反斜杠转义的引号被视为目录路径的文字部分。


ImH*_*ere 5

有没有办法让 ls 显示我的脚本中的路径?

是的,使用:

ls $HOME/New\ Folder/foobar.txt
Run Code Online (Sandbox Code Playgroud)

问题是您在变量的值中包含引号。目录的真实名称没有"引号。

您只需要使用一种引用方法来构建变量。

在变量中:

fpath=${HOME}/New\ Folder/foobar.txt
Run Code Online (Sandbox Code Playgroud)

或者:

fpath="${HOME}/New Folder/foobar.txt"
Run Code Online (Sandbox Code Playgroud)

甚至:

fpath=${HOME}/'New Folder/foobar.txt'
Run Code Online (Sandbox Code Playgroud)

完整脚本:

#!/bin/bash
fpath=${HOME}/New\ Folder/foobar.txt
echo "fpath=(${fpath})"
ls "${fpath}"
Run Code Online (Sandbox Code Playgroud)