2

Мне нужна помощь, чтобы понять, что означают эти две строки. Мне нужно внести некоторые изменения в скрипт bash для моей стажировки, и, поскольку я только начал читать bash сегодня, мне трудно понять, что это будет означать.

node="\\\\$1"

echo $node`echo $2|sed 's/\//\\\\/g'`

заранее спасибо

3 ответа3

4

Эта строка добавляет две обратные косые черты к первому аргументу сценария. Первая обратная косая черта в каждой паре избегает второй.

node="\\\\$1"

Эта строка принимает результат предыдущего и добавляет результат замены каждой косой черты во втором аргументе двумя обратными косыми чертами.

echo $node`echo $2|sed 's/\//\\\\/g'`

Если бы вы назвали свой сценарий так:

scriptname abc /def/ghi/jkl

тогда $node будет "\\abc" и будет отображаться следующее:

\\abc\\def\\ghi\\jkl

$1 и $2 называются позиционными параметрами и представляют первый и второй аргументы вашего скрипта. Если вы хотите сослаться на все из них вместе, независимо от того, сколько (до предела, разрешенного вашей системой), вы бы использовали $@ или $* .

Вот лучший способ написать эти две строки:

node='\\'"$1"

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

echo $node$(echo $2 | sed 's|/|\\\\|g')

Использование $() вместо обратных галочек более читабельно, их можно легко вкладывать, а цитирование и экранирование упрощаются. Используя альтернативный разделитель (в данном случае символ трубы) с sed вам не нужно избегать косой черты, и все это более читабельно. В этом случае все еще необходимо избегать обратной косой черты, поскольку sed обрабатывает их, а не Bash.

Если вы не знакомы с $() (или обратными галочками), они выполняют подстановку команд, что означает, что выходные данные вложенной команды (команд) подставляются вместо них.

Возможно, вы не знакомы с sed . Это внешняя по отношению к Bash (или другим оболочкам) утилита, которая может взять поток символов и отредактировать их. Конкретная команда, используемая здесь, это s которая обозначает замену. Он заменит то, что находится между вторым и третьим разделителями (обычно это косая черта, но вы можете использовать практически любой символ) для шаблона между первым и вторым разделителями. g - это модификатор, который вызывает глобальное замещение (т. Е. Каждый раз, когда оно происходит в строке ввода). Процесс повторяется для каждой строки ввода. В вашем примере есть только одна строка ввода - вывод эха.

1

1-я строка: узел - это переменная, установленная из командной строки. Итак, если вы делаете

runme.sh test

узел будет равен "\test". Первая косая черта избегает второй косой черты, рассматривая ее как буквальную косую черту вместо специального модификатора.

Затем он заменяет любые обратные косые черты в имени двумя косыми чертами, например, так

> runme.sh test/ing

\\test\\ing

Тогда это, вероятно, будет интерпретировано другой программой, которая проникает через косые черты, таким образом, требуя, чтобы их было две.

1

Непонятно, какие части этих строк вам трудно понять, поэтому я попытаюсь объяснить, что я считаю липкими частями.

Сценарий, над которым вы работаете, принимает как минимум два аргумента. Эти аргументы доступны в скрипте с именами $ 1 и $ 2. В первой строке первая обратная косая черта экранируется после символа, следующего за ним, вторая обратная косая черта, так что пара оценивается как одиночная обратная косая черта. То же самое верно для второй пары обратных слешей. $ 1 заменяется значением первого аргумента скрипта. Если скрипт запускается как

myscript apple banana/cantaloupe

значение узла будет "\\apple", без кавычек.

Команды в обратном тике (`) выполняются, затем обратные тики и вложенные команды заменяются выходом этих команд. Команда sed заменяет каждую косую черту в своем входном потоке на пару обратных косых черт. Поскольку в этом примере $ 2 - это «банан / канталупа», результатом выполнения команд внутри обратных тиков будет «банан \\ канталупа». Выходной информацией второй строки является значение узла, объединенного с результатом выражения обратной галочки, или "\\ applebanana \\ cantaloupe".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .