在MacOSX中为目录名的bash $参数保持斜杠

时间:2017-01-31 18:43:07

标签: bash macos directory arguments slash

在MacOSX中,可以在Finder中创建一个名称中包含正斜杠“/”的文件夹。

我试图通过执行与

类似的操作来破坏脚本
args=("$@")
name=${args[0]}
street_corner=${args[1]}
my_folder="Hello ${name} - ${streetcorner}"
mk () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1"
}
mk $my_folder

其中街角是“街道1 /街道2”格式的十字路口,因此需要将斜杠保存在目录名称中。

我读了several articles like this one,在那里他们解释了如何操纵字符串以逃避或保持向前自己设置字符串。我遇到的问题是用户传递了要在脚本中使用的参数,因此当我运行命令以 $ my_folder 作为参数创建目录时,该字符串已被封装。

如何在不让正斜杠创建位于目录“street 1”内的名为“street 2”的子目录而是创建名为“street 1 / street 2”的单个目录的情况下展开street_corner的值?

我尝试过这些修补程序并失败了

street_corner="${args[0]}"
my_folder='"Hello ${name} - ${streetcorner}"'
my_folder="'Hello ${name} - ${streetcorner}'"
my_folder="Hello ${name} - ${'streetcorner'}"
my_folder="Hello ${name} - ${$"streetcorner"}"
my_folder="Hello "${name}" - "${streetcorner}

还尝试为street_corner提供输入,如

./my_script.sh "name" "street 1\/street 2"
./my_script.sh "name" 'street 1/street 2'
./my_script.sh "name" "'street 1/street 2'"

3 个答案:

答案 0 :(得分:4)

涉及/:的路径名称(由于下面讨论的原因)在macOS下有点令人困惑。简短的回答是:

  • 您无法在文件名中使用/
  • 由于历史原因,Finder假装您可以
  • 同样由于历史原因,Finder假装您无法使用:

首先,/不是POSIX路径名中的有效字符;它被保留为路径组件分隔符。期望有效文件名作为参数的命令行工具将拒绝包含/的命令行工具。

Finder 出现,可让您创建名称中包含/的文件或文件夹,但它会将/静默转换为:。您可以从终端确认。在主目录中创建名为foo/bar的文件夹;如果您从终端运行foo:bar,它将显示为ls

其次,:历来被用作经典Mac OS中的路径分隔符。 Finder仍然不允许您创建名称包含:但命名行工具(如mkdir)的文件夹。 mkdir foo:bar将有效,并且名称将在Finder中显示为foo/bar

答案 1 :(得分:1)

您的问题不是引用问题。

正斜杠是UNIX类型操作系统中的路径分隔符。它几乎是文件名中唯一没有的字符(尽管它可以是路径的一部分,它允许表达目录层次结构)。您可以拥有空格,制表符,甚至换行符。但没有正斜线。

所以答案是,如果没有将street1/street2解释为目录以外的任何内容,则不能将street1用作文件名。

答案 2 :(得分:0)

在脚本中,您需要在行的右侧加双引号:

name="${args[0]}"
street_corner="${args[1]}"

和命令:

mk "$my_folder"

还有一个错字。从street_corner中删除下划线。

然后像这样调用脚本:

./my_script.sh "name" "street 1\/street 2"

./my_script.sh "name" 'street 1/street 2'