2017-01-31 13 views
1

В MacOSX можно создать папку в Finder, которая содержит косую черту «/» в названии.

Я пытаюсь Баш скрипт такой же, делая что-то похожее на

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, не позволяя косой чертой создать подкаталог под названием «улица 2», расположенный внутри каталога «улица 1», но вместо этого создав единый каталог под названием «улица 1/улица 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 в вашем домашнем каталоге; он появится как foo:bar, если вы запустите ls с терминала.


Во-вторых, : исторически использовалась в качестве разделителей пути в классической Mac OS. Finder по-прежнему не позволяет создавать папку, имя которой содержит :, но инструменты командной строки (например, mkdir). mkdir foo:bar будет работать, и далее в Finder появится имя foo/bar.

+0

Таким образом, вам необходимо преобразовать косые черты в streetcorner в colons в filename. Это должно работать: 'my_folder =" Hello $ {name} - $ {streetcorner // \ //:} ". Вы можете прочитать этот беспорядок в фигурных скобках как: значение переменной streetcorner ('streetcorner') со всеми вхождениями (' // ') символа косой черты (' \/'- обратите внимание, что он экранирован, поэтому он не будет ошибочно принимается за разделитель) заменяется ('/') двоеточиями (':'). –

+0

Спасибо за это @chepner и @ gordon-davisson! знак равно – Discofan