sed не развернет мою переменную Bash в сценарии

[112874]Обычно на жестком диске можно иметь только четыре основных раздела, ограничение, накладываемое структурой таблицы разделов.

enter image description here

Чтобы обойти это и получить больше разделов, система создает расширенный раздел, который имеет свою собственную структуру таблицы разделов для хранения большего количества разделов. Расширенный раздел занимает один из слотов основного раздела.

Я не уверен, почему Fedora не пытается использовать доступное пространство в расширенном разделе. При установке SuSE и Ubuntu я не помню, чтобы мне нужен был основной раздел для установки.

Можно попробовать перезагрузиться после удаления расширенного раздела, если программа установки не заметила изменения на диске. Или, наоборот, вручную создать разделы в расширенном разделе и распределить их по Fedora.[112881].

1
07.02.2015, 16:20
3 ответа

Вы вставляете цитирование символов в строку. Проблема в том, что цитирование символов не проанализируется после расширения параметров. Чтобы получить желаемый эффект, вам потребуется

eval sed ... $drill_file

, вы можете использовать SET -X , чтобы увидеть, как оболочка видит командную строку:

> text=a\\\ \\\ \\\ b
> echo $text
a\ \ \ b
> set -x
> : $text
+ : 'a\' '\' '\' b

I.E. Оболочка не видит одного аргумента, но четыре.

Как Alady сказал остальными: вы должны цитировать $ DRELL_FILE / $ DRELL_FILE_TEMP : «$ DRELL_FILE»

2
27.01.2020, 23:20

Вам не нужно делать первую SED, если вы процитируете ваши переменные:

read -p "Give relative or absolute path to the \"drill.TXT\" file: " drill_file
if [[ -f "$drill_file" ]]; then
    sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]/\1\2/' "$drill_file"
    echo "Conversion finished."
else
    echo "no such file: '$drill_file'"
fi
2
27.01.2020, 23:20

Ядро не понимает \ (Backslash)
Если DREL_FILE является «файлом \ с \ Space», SED выполняется как
SED 'S / \ (^ x [[[: цифра:]] * \) [[: цифра:]] \ (y [[: цифра:]] * \) [[: цифра:]] / \ 1 \ 2 / 'файл \ с \ space .
Сначала сама клоны оболочки и вызывает одно семейство функций ExecL, проходящее в аргументе ARGV [0] = SED, ARGV [1] = S / (^ x [[[: digit:]] [) [[[: цифра: ]] (Y [[: digit:]] [) [[: цифра:]] / \ 1 \ 2 /, argv [2] = файл \, argv [3] = с \ и argv [4] = космос. EXECL заменяет оболочку с SED. Когда SED начинает работать, он звонит Открыть («Файл \», O_Rdonly) и делает то же самое для «с \» и «пространством». Ядро проходит запрос к первоначальному FS. ФС возвращает Enoent, что означает отсутствие такого входа в FS. Это правда, потому что на самом деле нет таких файлов. SED получает ошибку и отображает сообщение об ошибке.

Если цитируются $ DRELL_FILE, SED получает имя файла как «Файл \ с \ Space» и не открывает на этот раз.

Eval Sed 'S / \ (^ x [[[: Digit:]] * \) [[: цифра:]] \ (y [[: digit:]] * \) [[[: цифра:]] / \ 1 \ 2 / '"$ DRELL_FILE"
Здесь Eval Prises его ARGS и создает команды и выполняет команду создания. Это просто избыточно и запутано, вы ломаете и исправляете.

\ (Backshallash) Ударение только применимо только при запуске оболочки. SED 'S / \ (^ x [[[: цифра:]] * \) [[: digit:]] \ (y [[[: digit:]] * \) [[[: цифра:]] / \ 1 \ 2 / ' « $ DRELL_FILE_TEMP « Просто преуспели бы.
Это тоже работает.

sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]/\1\2/' \
"$(read -p "Give relative or absolute path to the \"drill.TXT\" file: " \
drill_file_temp;echo $drill_file_temp)"
0
27.01.2020, 23:20

Теги

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