Вот простой сценарий для передачи пути к файлу к ls
или chmod
но имена файлов с пробелами не работают, даже когда включено в метки кавычки.
Как я заставляю это работать?
#!/bin/sh
# Script to fix permissions on supplied folder and file name
echo "Enter Folder name"
read folder
echo "Folder name is "$folder
echo "Enter File name - if name includes spaces enclose in single quote marks"
read filename
echo "File name is "$filename
fullpath="/home/abc/"$folder"/"$filename
echo "Full path is "$fullpath
fixcommand="chmod a+rw -v "$fullpath
echo "Command to be executed is "$fixcommand
echo -n "Is that correct (y/n)? "
read answer
if echo "$answer" | grep -iq "^y" ;then
$fixcommand
else
echo No action taken
fi
В сценарии, предоставленном Вами, на самом деле не заключаются в кавычки переменные.
Необходимо обновить сценарий и заключить переменные в кавычки с ""
Например:
fullpath="/home/abc/"$folder"/"$filename
Должен быть:
fullpath="/home/abc/$folder/$filename"
Спасибо за @glenn jackman - кто предложил читать последствия безопасности упущения заключить переменную в кавычки в оболочках удара/POSIX
Можно найти ниже полную обратную связь сайта проверки оболочки на сценарии
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.
Кавычки ничего не значат для read
, и обнаружится в переменной. Кавычки в переменной являются также просто регулярными символами: нет никакого шага в обработке оболочки, где кавычки вступили бы в силу после того, как переменная была расширена.
Единственное исключение - то, если Вы явно добавляете другой слой обработки оболочки, любого путем выполнения чего-то как bash -c "$somevar"
, или использование eval
. Это не очень хорошая идея, хотя, так как обычно Вы хотели бы постараться не смешивать данные и код.
Так, что необходимо сделать, должен 1) иметь read
передайте вход пользователя переменной с как можно меньшим количеством изменений и затем 2) используйте переменную в кавычках для передачи его от оболочки до команды без изменений.
read filename
отдельно в значительной степени в порядке, это обрабатывает пробел посреди строки. Но это действительно разделяет продвижение и конец пробела, и это рассматривает обратные косые черты как специальные символы. Для выключения тех функций использовать 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"
Спасибо вся Заключительная рабочая версия:
#!/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