Одиночные кавычки и переменные внутри оболочки Борна

У меня есть команда, которую я пытаюсь выполнить в оболочке Bourne для Solaris 9.

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

Моя проблема, переменная ${PARSEDATA} не будет работать должным образом, я попытался использовать двойные кавычки, то проблема $0 имя скрипта, выполняющего этот код, а не файл, расположенный с помощью find команда.

Любые предложения, чтобы решить эту, вероятно, легкую проблему, очень полезны.

Заранее спасибо.

Обновить: $0 это имя скрипта, расположенного с использованием find команда, переменная для ${PARSEDATA} это фильтр, расположенный где-то в системе, который изменяет вывод каждого найденного скрипта. Однако проблема в том, что я не могу получить $0 а также ${PARSEDATA} правильно расширяться, либо $0 расширяется нормально, используя одинарные кавычки или двойные кавычки ${PARSEDATA} расширяется нормально, но потом $0 становится именем оригинального скрипта, который запускает этот find-command.

3 ответа

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

export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

Если вы хотите, чтобы оболочка $0 не была расширена оболочкой (используя одинарные кавычки), а ${PARSEDATA} была расширена, то почему бы просто не использовать разные кавычки для каждого:

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}

Пока вы сохраняете объединенные части в кавычках, оболочка будет просто расширять ${PARSEDATA} и передавать всю команду как один токен для поиска.

Я не уверен в том, что вы пытаетесь сделать? Но если вы хотите найти сценарии с именем check_*, а затем запустить его и передать через программу ${PARSE_DATA}, я думаю, что файл, найденный командой find, не является $0 но {}

пример

find /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \; (Википедия)

Поэтому я думаю, что вы можете использовать ваши двойные кавычки:

find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}

Я попытался успешно:

PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;

> Bleh Blah
Другие вопросы по тегам