Как я могу передать вывод команды в виде списка аргументов в сценарий?

Проверьте эту утилиту на основе Java nzip для вложенных zip-файлов. Извлечение и сжатие вложенных zip-файлов можно легко выполнить с помощью следующих команд

java -jar nzip.jar -c list -s readme.zip

java -jar nzip.jar -c extract -s "C :\project\readme.zip" -t readme

java -jar nzip.jar -c compress -s readme -t "C :\project\readme.zip"

ПС. Я автор и буду рад быстро исправить любые ошибки.

2
29.04.2020, 04:23
2 ответа

Я бы выбрал что-то вроде:

find <dir> -type f -print0 | xargs -0 sed -i '...'

вместо всего цикла until. Тоже должно быть быстрее.

Причины, по которым я разместил альтернативу:

  • Не парсить lsвывод(600+ голосов)

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

  • Большинство самодельных -конструкций будут иметь проблемы либо с "файлами с пробелами", либо с проблемами с длиной аргумента.

2
19.03.2021, 02:25

Чтобы обрабатывать каждый аргумент отдельно в вашем скрипте, используйте цикл в своем подобном:

for pathname do

    # Insert code here that uses "$pathname".
    # You will not need to shift arguments.

done

Чтобы вызвать скрипт со всеми именами в текущем каталоге, используйте

./script.sh./*

Оболочка расширит шаблон ./*до списка, содержащего все имена в текущем каталоге.

Это имеет то преимущество перед использованием ls, что не использует lsи, следовательно, справится с именами файлов, которые содержат любые допустимые символы, даже пробелы, символы табуляции и новые строки.

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

for pathname in./*; do
    # Insert code here that uses "$pathname".
done

Если ваш скрипт должен различать имена, которые относятся к обычным файлам, и имена, которые относятся к чему-либо, что не является обычным файлом (, например. каталоги ), используйте тест -fв своем цикле:

# skip non-regular files
[ ! -f "$pathname" ] && continue

Это по-прежнему позволяет использовать символические ссылки на обычные файлы. Чтобы их тоже пропустить, измените тест на

if [ ! -f "$pathname" ] || [ -L "$pathname" ]; then
    # Skip non-regular files and symbolic links.
    continue
fi

Другие комментарии:

Вы можете назначить многострочную -строку переменной, включив символы новой строки в строку:

boilerplate='Hello and welcome!
This is my program.
Enjoy'

Чтобы вставить текст после второй строки в текстовый документ, используйтеsed(с помощью -iздесь для в -место редактирования):

printf '%s\n' "$boilerplate" | sed -i '2r /dev/stdin' somefile

или, при наличии здесь -документа,

sed -i '2r /dev/stdin' somefile <<END_BOILERPLATE
Hello and welcome!
This is my program.
Enjoy
END_BOILERPLATE
6
19.03.2021, 02:25

Теги

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