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

Вот простой сценарий для передачи пути к файлу к 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 
0
задан 6 March 2018 в 07:23

3 ответа

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

Необходимо обновить сценарий и заключить переменные в кавычки с ""

Например:

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.
7
ответ дан 30 October 2019 в 07:53

Кавычки ничего не значат для 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"
0
ответ дан 30 October 2019 в 07:53

Спасибо вся Заключительная рабочая версия:

#!/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
-1
ответ дан 30 October 2019 в 07:53

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

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