【问题标题】:How to use a variable in bash when the folder name contains spaces? [duplicate]当文件夹名称包含空格时如何在bash中使用变量? [复制]
【发布时间】:2020-12-22 03:19:01
【问题描述】:

我正在处理我的 dotfiles 脚本,并正在创建一个 restore.sh 脚本以在全新安装后复制首选项、文件夹等。

我创建了一个检查以查看是否输入了驱动器名称作为参数,如果不使用默认驱动器。但是!...默认驱动器的文件名中有空格。

所以我创建了一个测试脚本来将文件从/Users/tim/My Folder/file.txt 复制到~/Desktop/file.txt

if [[ $# -eq 0 ]];
    then
    dir="My\ Folder"
else
    dir=$1
fi

options=(-a -v -h -W --progress --compress-level=0)

rsync "${options[@]}" "/Users/tim/$dir/file.txt" "~/Desktop/file.txt"

这行不通,所以我一直在玩这个的变体

from="/Users/tim/$dir/file.txt"
to="~/Desktop/file.txt"
options=(-a -v -h -W --progress --compress-level=0 $from $to)
rsync "${options[@]}"

但我不断收到以下错误

rsync: link_stat "/Users/tim/My\ Folder/file.txt" failed: No such file or directory (2)

我一直在阅读这方面的内容,并认为数组是在变量中添加空格的方法,但到目前为止我没有尝试过任何工作。

【问题讨论】:

  • 您是否尝试过删除dir="My\ Folder" 中的反斜杠?它不应该在那里。还可以考虑在另一个选项周围添加引号:dir="$1"
  • @TedLyngmo 如果我消除强烈反对,我会得到/Users/tim/Desktop/Folder/file.txt
  • 如果您删除反斜杠结尾,请执行echo "$dir" - 您看到了什么?
  • "~/Desktop/file.txt" 也是错误的。 ~ 如果放在引号中,将不会扩展到您的主目录。
  • @TedLyngmo 你说得对,我实际上不需要反斜杠(我刚刚升级到 Big Sur),而你提供的内容已修复。问题是波浪号。添加${HOME} 修复它。如果您愿意,请将其发布为答案,我会将其标记为已解决。谢谢!

标签: bash


【解决方案1】:
if [[ $# -eq 0 ]];
then
    dir="My Folder" # this shouldn't have a backslash, it becomes a part of the filename
else
    dir="$1"        # this should have quotation marks around it in case of globbing
fi

"~/Desktop/file.txt" 中的~ 不会扩展到主目录。请改用${HOME}

rsync "${options[@]}" "/Users/tim/$dir/file.txt" "${HOME}/Desktop/file.txt"

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 2022-12-22
    • 2023-04-01
    • 2011-10-14
    • 2013-08-30
    • 2018-09-06
    • 1970-01-01
    • 2011-02-02
    • 2010-09-13
    相关资源
    最近更新 更多