Вы просто пропустили ,тогда
:
if ls /Volumes/Shared; then
echo success
else
echo failure
exit 1
fi
Похоже, что вокруг содержимого noquotes.txt вставлены дополнительные кавычки, но не вокруг quotes.txt.
Это просто помощь Баша. Вы заметите, что он будет заключать в кавычки всякий раз, когда есть символ, который в противном случае интерпретировался бы Bash. Он действует так же, как и вы, используя кавычки только при необходимости. Попробуйте поместить в файл quotes.txt любое из следующего:
s/a$/a/g
s/"hi"/"bye"/g
Список можно продолжать и продолжать.
Теперь вернемся к вашему исходному вопросу. Прежде всего, ваш sed
выводит странное сообщение. Из set -x
очевидно, что вводится «s / a / b / g»
, а не «s / a / b / g»
. Я бы не поверил этому сообщению. Вот что GNU sed 4.2.1 выводит для "s / a / b / g"
:
$ sed -e '"s/a/b/g"'
sed: -e expression #1, char 1: unknown command: `"'
Довольно ясно: поскольку первый символ - это имя команды, а там нет команды с именем "
, sed
не знает, что делать.
В обработке командной строки есть шаг, который называется шагом удаления кавычек . Обычно это последнее, что происходит перед выполнением команды, и оно удаляет внешние наборы кавычек, которые вы использовали для цитирования строк в команде.
Для такой команды, как
sed -e "s/a/b/g"
На этом шаге убедитесь, что команде sed
в качестве последнего аргумента задана строка s/a/b/g
, а не"s/a/b/g"
.
Когда вы читаете строку "s/a/b/g"
из файла с помощью cat
в подстановке команды, кавычки не удаляются, так как они не являются частью исходной команды (они являются частью считываемых данных из файла ).
Это означает, что sed
получит буквальную строку "s/a/b/g"
в качестве выражения для запуска, и поэтому он жалуется, что не понимает первоначальную"
(команду sed
, ожидавшую команду ).
Что касается результатов трассировки set -x
, рассматривайте их как не более чем отладочные данные. Оболочка bash
добавит кавычки вокруг строк, содержащих определенные символы в трассировке, поэтому это не указывает на то, что на самом деле было заключено в кавычки любого отдельного аргумента или как оно было интерпретировано вызванной утилитой.
Кроме того, чтобы запустить sed
со сценарием редактирования в файле, используйте параметр -f
:
sed -f noquotes.txt <<<"aaa"
Кроме того, команда y
в sed
может использоваться для более эффективной транслитерации между одним набором одиночных символов в другой, чем замена с помощью s
. Вашу замену s/a/b/g
лучше записать как y/a/b/
.
Если это единственная операция, которую вам нужно выполнить, то может быть даже эффективнее использовать более простую tr
утилиту:
tr a b <<<"aaa"