Имена файлов с пробелами в скриптах

Прежде всего, спасибо за ваш «выход». Это спасло мои волосы!

У меня была аналогичная проблема с Ubuntu 12.10. После связывания команды

sudo mdadm --detail /dev/md0

я увидел, что устройства рейда все еще синхронизируются. Другими словами, рейд по-прежнему считается деградированным, пока устройства не синхронизируются. После завершения синхронизации у меня не было проблем с загрузкой.

Надеюсь, это поможет!

0
задан 6 March 2018 в 18:23

6 ответов

Спасибо всем. Окончательная рабочая версия:

#!/bin/sh # Script to fix permissions on supplied folder and file name # including folders and filenames containing spaces echo "Fixfilepermissions running" echo "Enter Folder name" IFS= read -r folder echo "Folder name is "$folder echo "Enter File name" IFS= read -r filename echo "File name is "$filename fullpath="/home/abc/$folder/$filename" echo "Full path is "$fullpath echo "Command to be executed is: chmod a+rw -v \"$fullpath\"" echo -n "Is that correct (y/n)? " read answer if echo "$answer" | grep -iq "^y" ;then chmod a+rw -v "$fullpath" else echo "No action taken" fi
0
ответ дан 17 July 2018 в 19:25

Цитаты ничего не означают read и будут отображаться в переменной. Котировки внутри переменной также являются просто регулярными символами: в обработке оболочки нет шага, где кавычки вступают в силу после расширения переменной.

Единственным исключением является то, что вы явно добавляете еще один слой обработки оболочки, либо запуская что-то вроде bash -c "$somevar", либо используя eval. Это не очень хорошая идея, поскольку, как правило, вы хотите избежать смешивания данных и кода.

Итак, вам нужно сделать следующее: 1) иметь read пропустите вход пользователя в переменную с как можно меньшим количеством изменений, а затем 2) используйте переменную в кавычках, чтобы передать ее из оболочки в команду без изменений.

read filename сам по себе в значительной степени ok, он обрабатывает пробелы в середине строки. Но он лишает ведущие и хвостовые пробелы и обрабатывает обратные косые черты как специальные символы. Чтобы отключить эти функции, используйте IFS= read -r filename.

При использовании этой переменной вы должны выполнить команду как chmod a+rw -v "$filename".

Вы не можете сохранить все это до переменная, ее невозможно будет правильно отделить. "$fixcommand" будет обрабатывать все значение как одну строку, имя команды. $fixcommand также разделит ваше имя файла. (BashFAQ 050 обсуждает сохранение команды переменной)

Всего:

IFS= read -r filename fullpath="/home/abc/$folder/$filename" echo "Command to be executed is: chmod a+rw -v \"$filename\"" # confirmation... chmod a+rw -v "$filename"
0
ответ дан 17 July 2018 в 19:25

В предоставленном вами скрипте переменные на самом деле не цитируются.

Вы должны обновить свой скрипт и указать переменные с помощью «»

Например:

fullpath="/home/abc/"$folder"/"$filename

переменные на самом деле не цитируются

fullpath="/home/abc/$folder/$filename" Спасибо за @glenn jackman - кто предложил прочитать последствия безопасности, забывая процитировать переменную в bash / POSIX shell

Ниже вы можете найти полную информацию о сайте проверки оболочки на вашем скрипте

Line 5: read folder ^-- SC2162: read without -r will mangle backslashes. Line 6: echo "Folder name is "$folder ^-- SC2086: Double quote to prevent globbing and word splitting. Line 8: read filename ^-- SC2162: read without -r will mangle backslashes. Line 10: echo "File name is "$filename ^-- SC2086: Double quote to prevent globbing and word splitting. Line 11: fullpath="/home/abc/"$folder"/"$filename ^-- SC2027: The surrounding quotes actually unquote this. Remove or escape them. Line 13: echo "Full path is "$fullpath ^-- SC2086: Double quote to prevent globbing and word splitting. Line 17: echo "Command to be executed is "$fixcommand ^-- SC2086: Double quote to prevent globbing and word splitting. Line 19: echo -n "Is that correct (y/n)? " ^-- SC2039: In POSIX sh, echo flags are undefined. Line 20: read answer ^-- SC2162: read without -r will mangle backslashes.
7
ответ дан 17 July 2018 в 19:25

Спасибо всем. Окончательная рабочая версия:

#!/bin/sh # Script to fix permissions on supplied folder and file name # including folders and filenames containing spaces echo "Fixfilepermissions running" echo "Enter Folder name" IFS= read -r folder echo "Folder name is "$folder echo "Enter File name" IFS= read -r filename echo "File name is "$filename fullpath="/home/abc/$folder/$filename" echo "Full path is "$fullpath echo "Command to be executed is: chmod a+rw -v \"$fullpath\"" echo -n "Is that correct (y/n)? " read answer if echo "$answer" | grep -iq "^y" ;then chmod a+rw -v "$fullpath" else echo "No action taken" fi
0
ответ дан 23 July 2018 в 20:10

Цитаты ничего не означают read и будут отображаться в переменной. Котировки внутри переменной также являются просто регулярными символами: в обработке оболочки нет шага, где кавычки вступают в силу после расширения переменной.

Единственным исключением является то, что вы явно добавляете еще один слой обработки оболочки, либо запуская что-то вроде bash -c "$somevar", либо используя eval. Это не очень хорошая идея, поскольку, как правило, вы хотите избежать смешивания данных и кода.

Итак, вам нужно сделать следующее: 1) иметь read пропустите вход пользователя в переменную с как можно меньшим количеством изменений, а затем 2) используйте переменную в кавычках, чтобы передать ее из оболочки в команду без изменений.

read filename сам по себе в значительной степени ok, он обрабатывает пробелы в середине строки. Но он лишает ведущие и хвостовые пробелы и обрабатывает обратные косые черты как специальные символы. Чтобы отключить эти функции, используйте IFS= read -r filename.

При использовании этой переменной вы должны выполнить команду как chmod a+rw -v "$filename".

Вы не можете сохранить все это до переменная, ее невозможно будет правильно отделить. "$fixcommand" будет обрабатывать все значение как одну строку, имя команды. $fixcommand также разделит ваше имя файла. (BashFAQ 050 обсуждает сохранение команды переменной)

Всего:

IFS= read -r filename fullpath="/home/abc/$folder/$filename" echo "Command to be executed is: chmod a+rw -v \"$filename\"" # confirmation... chmod a+rw -v "$filename"
0
ответ дан 23 July 2018 в 20:10
  • 1
    IFS = read -r filename fullpath = & quot; / home / abc / $ folder / $ filename & quot; echo & quot ;. Команда, подлежащая выполнению, это: chmod a + rw -v \ & quot; $ filename \ & quot; & quot; # подтверждение ... chmod a + rw -v "$ filename & quot; – Chris W 8 March 2018 в 13:39

В предоставленном вами скрипте переменные на самом деле не цитируются.

Вы должны обновить свой скрипт и указать переменные с помощью «»

Например:

fullpath="/home/abc/"$folder"/"$filename

переменные на самом деле не цитируются

fullpath="/home/abc/$folder/$filename" Спасибо за @glenn jackman - кто предложил прочитать последствия безопасности, забывая процитировать переменную в bash / POSIX shell

Ниже вы можете найти полную информацию о сайте проверки оболочки на вашем скрипте

Line 5: read folder ^-- SC2162: read without -r will mangle backslashes. Line 6: echo "Folder name is "$folder ^-- SC2086: Double quote to prevent globbing and word splitting. Line 8: read filename ^-- SC2162: read without -r will mangle backslashes. Line 10: echo "File name is "$filename ^-- SC2086: Double quote to prevent globbing and word splitting. Line 11: fullpath="/home/abc/"$folder"/"$filename ^-- SC2027: The surrounding quotes actually unquote this. Remove or escape them. Line 13: echo "Full path is "$fullpath ^-- SC2086: Double quote to prevent globbing and word splitting. Line 17: echo "Command to be executed is "$fixcommand ^-- SC2086: Double quote to prevent globbing and word splitting. Line 19: echo -n "Is that correct (y/n)? " ^-- SC2039: In POSIX sh, echo flags are undefined. Line 20: read answer ^-- SC2162: read without -r will mangle backslashes.
7
ответ дан 23 July 2018 в 20:10

Другие вопросы по тегам:

Похожие вопросы: