2015-05-28 3 views
1

До этого момента в сценарии я использовал set -- "[email protected]" и shift для преобразования позиционных аргументов для вызова find.Ошибка в моем скрипте оболочки после манипуляции позиционными параметрами с кавычками?

Вот пример манипуляции я сделал:

set -- "[email protected]" -iname "\"*$1\"" -print 

Ниже, я повторяю то, что я думаю, что я собираюсь выполнить. Но когда я передаю результат в цикл while, он не сообщает о каких-либо файлах (vs, когда я запускаю его вручную).

set -x 
echo find "[email protected]" 
find "[email protected]" 2>/dev/null | while read -r f; do 
          echo found "$f" 
         done     

Вот результат работы скрипта. (Обратите внимание на двойные кавычки " ниже. Примечание также комментарий ниже о том, как мое окружение (BusyBox v1.18.4) set -x не отображает котировки должным образом.)

+ echo find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print 
find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print 
+ read -r f 
+ find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print 

(Не-багги set -x печатает '"*.png"' вместо "*.png".)

Как вы можете видеть, он не распечатывал никаких имен файлов. Вот что происходит, когда я проверяю (что я думаю) то же самое в ответ на приглашение:

$ find /images/dir -follow -maxdepth 1 -type f -iname "*.png" -print -o -iname "*.jpg" -print 2>/dev/null | while read -r f; do 
> echo found "$f" 
> done 
found /images/dir/foo.jpg 
found /images/dir/bar.png 

Что вызывает разницу? Это находится на BusyBox v1.18.4

+2

Цитаты в ваших позиционных значениях аргументов не будут работать так, как вы ожидаете. См. Http://mywiki.wooledge.org/BashFAQ/050 для обсуждения этого. Версия tl; dr заключается в том, что вы не хотите, чтобы кавычки * в * указывали значения в котировках вокруг '' $ @ "', чтобы каждый аргумент не был оценен и не был разбит на слова. –

+0

BTW, я не вижу, где вы показываете фактический код манипуляции argv, ответственный за проблему. Попробуйте показать достаточно кода в своих вопросах, которые люди могут копировать и вставлять, чтобы воспроизвести проблему. –

+0

(В отдельном случае используемая оболочка busybox имеет ошибочную реализацию 'set -x', которая неправильно выводит кавычки в свой вывод; * sigh *). –

ответ

2

Ваш скрипт ищет имена файлов с буквами " символов в них.

Это означает, что вы делаете что-то вроде:

set -- "[email protected]" -iname '"*.png"' 

... вместо правильной альтернативы ...

set -- "[email protected]" -iname '*.png' 

См BashFAQ #50 для деталей и фона на множестве недоразумений что обычно приводит к этой ошибке. :)

+0

На самом деле вместо '.png' у меня было' $ 1', поэтому проблема заключалась в том, что вместо '' '* $ 1' '' '' '\ $ 1 \" "' '' '' '$ 1' '. Та же идея, что и ваш ответ, и комментарий Этана Рейснера. Я думаю, что принятый ответ должен ссылаться на что-то подобное. FAQ/050 – user1011471

+0

Согласен; ссылка добавлена. (И да, '' * $ 1 "' правильно). –