2017-01-31 77 views
1

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

我试图bash脚本做类似的东西一样来

args=("[email protected]") 
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_corner的值而不让正斜杠创建名为“street 2”的子目录位于目录“street 1”内,而是创建一个名为“street 1/street 2”的目录?

我尝试了这些修复和故障

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'" 

回答

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' 
1

你的问题不是引用的一个。

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

所以答案是,你不能使用street1/street2作为文件名,而不能将street1解释为目录以外的任何东西。

4

涉及/:的路径名(下面将讨论的原因)在macOS下有点混淆。简短回答如下:

  • 您不能在文件名中使用/
  • 由于历史原因,Finder假装您可以
  • 也出于历史原因,Finder假装您不能使用:

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

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


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

+0

因此,您需要将streetcorner中的斜线转换为文件名中的冒号。这应该工作:'my_folder =“Hello $ {name} - $ {streetcorner // \ //:}”。你可以在花括号中读到这样的混乱:streetcorner变量的值('streetcorner')与所有出现的(''''''斜杠字符''''''' - 注意它被转义了,所以它不会是误认为是分隔符)替换为('/')冒号(':')。 –

+0

感谢@chepner和@ gordon-davisson! =) – Discofan