До этого момента в сценарии я использовал 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
Цитаты в ваших позиционных значениях аргументов не будут работать так, как вы ожидаете. См. Http://mywiki.wooledge.org/BashFAQ/050 для обсуждения этого. Версия tl; dr заключается в том, что вы не хотите, чтобы кавычки * в * указывали значения в котировках вокруг '' $ @ "', чтобы каждый аргумент не был оценен и не был разбит на слова. –
BTW, я не вижу, где вы показываете фактический код манипуляции argv, ответственный за проблему. Попробуйте показать достаточно кода в своих вопросах, которые люди могут копировать и вставлять, чтобы воспроизвести проблему. –
(В отдельном случае используемая оболочка busybox имеет ошибочную реализацию 'set -x', которая неправильно выводит кавычки в свой вывод; * sigh *). –