Хранение команд в файлах

for x in /path/to/source/**/*.ext1; do convert $x ${x:r}.ext2 done

r в ${x:r} модификатор истории. Существует краткая форма for это сохраняет несколько символов.

for x (/path/to/source/**/*.ext1) convert $x ${x:r}.ext2
0
07.03.2012, 02:12
3 ответа

У Вас все еще есть многочисленные проблемы в Вашем сценарии.

Прежде всего текстовый редактор является правильным способом создать сценарий 99% времени. Создание его вручную линию за линией с командами эха утомительно и не предлагает преимущества вообще. (Другой 1% покрывает случаи, где Вы находитесь в системе, которая не имеет редактора, Вы знакомы с, или где существует серьезное основание использовать программу для генерации сценария автоматически, ни один из которых не должен применяться в случае.)

Первая строка должна быть #!/bin/tcsh -f, нет #!/bin/tcsh. -f говорит этому не получать Ваши файлы запуска (.tcshrc, .cshrc, .login), таким образом, Ваш сценарий будет автономным. Отсутствие -f вероятно, не вызовет проблем, но наличие его является хорошей практикой. (Отметьте: это не относится sh или bash сценарии; для тех оболочек, -f средства что-то еще полностью.)

Эта строка:

sed "s/_/-/g" $sql

чтения каждый файл, изменяя все символы нижнего подчеркивания на дефисы - но вывод записаны в stdout, не назад во входной файл. Сами файлы не изменяются. Так как Вы позже делаете это:

echo You changed $n files

Я предполагаю, что это не согласуется с Вашими планами.

Изменение файлов на месте на самом деле умеренно хитро. Я сделал бы что-то вроде этого:

sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql

Это изменяет файл $sql, запись измененной версии во временный файл. Если это успешно выполняется, это затем переименовывает временный файл к $sql.

Существует также a -i опция к sed это сделает что-то подобное; другой подход:

sed -i.bak "s/_/-/g" $sql

Добавление отступа является Вашим другом. Все между foreach и end строки должны быть расположены с отступом для показа структуры кода. (Я использую 4 пробелов сам; некоторые люди предпочитают другое количество пробелов или используют вкладки.)

Наконец, chmod 777 test не должен быть в test сам сценарий. Необходимо выполнить ту команду из командной строки, для создания test исполняемый файл сценария. И 777 плохая идея; это делает Ваш сценарий читаемым, исполняемым, и перезаписываемым всеми в системе. Использовать chmod +x test вместо этого.

Убедитесь, что Вы выполняете сценарий путем ввода ./test, не просто test. (Ваш вопрос говорит, что Вы уже делаете это.) Иначе Вы могли бы выполнить встроенное test команда, а не Ваш сценарий. Нет ничего неправильно с именованием Вашего сценария test, пока Вы (a) последовательно используете ./test синтаксис для вызова его, и (b) Вы не имеете . каталог в Вашем $PATH.

Если Вы собираетесь быть записью большого количества сценариев, необходимо рассмотреть использование sh или bash вместо csh или tcsh. Это эссе объясняет почему.

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

3
28.01.2020, 02:14
  • 1
    Эй Keith, я ценю подробное сообщение, но оно просто не хочет работать. Я теперь получаю сообщение, говоря 'неизвестную опцию: '-Usage:tcsh [-bcdefilmnnqstvVxX] [аргумент...]. Мне поставили задача, где я должен изменить все типы определенного файла, которые имеют символ подчеркивания в них и записывают, сколько файлов я на самом деле изменился. Это в основном настолько просто, я просто не могу найти, что любые ресурсы помогают мне выяснить, как это должно на самом деле быть сделано. –  r0bb077 07.03.2012, 12:29
  • 2
    Проигнорируйте, что это сила, что Вы первоначально сказали о 'тестовом' имени файла, я изменил его на другое случайное имя, и это хорошо работало. спасибо за Вас помогает здесь! –  r0bb077 07.03.2012, 12:39
  • 3
    @r0bb077: я рад, что Вы получили его работа, но если Вы вызывали сценарий как ./test, название сценария не должно было иметь никакого значения. Это, должно быть, было некоторое другое изменение, которое решило проблему. –  Keith Thompson 07.03.2012, 21:19

Попытка, что Вы делаете из командной строки оболочки, чревата проблемами. Вы имеете к echo и перенаправьте каждую строку, и необходимо заключить любые метасимволы оболочки в кавычки, чтобы они быть интерпретированными текущей оболочкой и не не превращают ее в файл, который Вы создаете. Вы - более обеспеченное использование текстового редактора для редактирования Вашего test файл и ввод оболочки управляют непосредственно там.

5
28.01.2020, 02:14
  • 1
    я пробовал это, но я не могу заставить терминал распознавать цикл foreach. У меня есть это в файле - 'foreach sql (_ .sql)', но я продолжаю получать ошибку systax ошибка во лжи 2: '(' неожиданный. Любые идеи –  r0bb077 06.03.2012, 11:32
  • 2
    Вы пишете a tcsh- сценарий стиля. Могло случиться так, что Вы непреднамеренно пытаетесь выполниться, это с Bourne вводит оболочку, например. bash или sh? Это объяснило бы сообщение об ошибке. Поместить #!/bin/tcsh наверху файла, чтобы сказать системе использовать tcsh как интерпретатор. –  Kyle Jones 06.03.2012, 21:35
  • 3
    Эй Kyle, я ценил Вашу справку здесь, но я получаю ошибку 'команда, не найденная', теперь я вставил это. Я отредактировал свое исходное сообщение выше, чтобы показать Вам, что я вошел в свой файл теперь. Где я иду не так, как надо? –  r0bb077 07.03.2012, 00:41
  • 4
    Необходимо использовать end вместо End. –  Kyle Jones 07.03.2012, 01:53
  • 5
    Жаль Kyle, все еще получая то же самое?! –  r0bb077 07.03.2012, 02:17

Как предложено, используйте редактора для записи сценариев оболочки.

Здесь исправления к Вашей отредактированной версии:

Необходимо записать set n=0 вместо n=0 избавиться от "команды, не найденной" сообщение об ошибке,

foreach sql ( *_*.sql ) вместо foreach sql *_*.sql

и end вместо End.

Вам нужны нормальные кавычки " вместо заключить параметры в кавычки для sed.

0
28.01.2020, 02:14
  • 1
    Привет Jofel, спасибо за Ваш вход, но я все еще, кажется, получаю точно то же сообщение об ошибке после Ваших изменений. Я отредактировал свое сообщение снова с тем, что я имею –  r0bb077 07.03.2012, 02:12
  • 2
    @r0bb077 видит ответ от Keith Thompson –  jofel 07.03.2012, 10:46

Теги

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