Использование контурной петли для переменной окружения

Я пытаюсь написать код, который перемещает файлы в каталог .junk, используя встроенные переменные среды. Моя цель состоит в том, что все, что пользователь должен будет сделать, это ввести sh junk filename1 filename2 filename3 … и скрипт будет использовать $ 1, $ 2, $ 3 … для перемещения файлов. К сожалению, я не могу полностью заставить контур счетчика работать правильно.

#!/bin/s if [ $# = 0 ] then echo "Usage: junk -l | -p | { filename }*" elif [ $1 = "-l" ] && [ $HOME/.junk ] then ls $HOME/.junk elif [ $1 = "-p" ] && [ $HOME/.junk ] then rm -r $HOME/.junk elif [ $1 = "$@" ] && [ $HOME/.junk ] then echo $# i=1 s="$" while [ $i -le $# ] do echo $s$i mv $s$i .junk/$i i=$(($i+1)) done fi 

2 Solutions collect form web for “Использование контурной петли для переменной окружения”

Некоторые непосредственные проблемы:

  1. Используйте getopts для обработки аргументов или есть причина, почему нет.
  2. Если скрипту задано более одного аргумента, "$@" в третьем elif взорвет его.
  3. Используйте for f in "$@" цикле for f in "$@" вместо цикла while.

Зачем?

  1. Что произойдет, если вы sh junk --help … или еще один интересный вариант mv ?
  2. QED
  3. Упрощенный => Лучше
 #!/bin/sh junkdir="$HOME/.junk" do_list=0 do_purge=0 while getopts 'lp' opt; do case "$opt" in l) do_list=1 ;; p) do_purge=1 ;; *) printf 'Usage: %s [-l|-p] [ name ... ]\n' "$0" >&2 exit 1 ;; esac done shift "$(( OPTIND - 1 ))" if [ "$do_list" -ne 0 ]; then printf 'Current junk in "%s":\n' "$junkdir" ls -l "$junkdir" fi if [ "$do_purge" -ne 0 ]; then printf 'Emptying junk directory "%s"\n' "$junkdir" rm -rf "$junkdir" mkdir "$junkdir" fi if [ ! -d "$junkdir" ]; then printf '%s: Missing junk directory "%s"\n' "$0" "$junkdir" >&2 printf '%s: Re-run with -p to create it\n' "$0" exit 1 fi if [ "$#" -eq 0 ]; then exit fi echo 'Junking the following things:' printf '%s\n' "$@" mv "$@" "$junkdir" 

Этот скрипт реализует то, что вы пытаетесь сделать. Он использует getopts для разбора флагов командной строки -l и / или -d .

Я устанавливаю do_list и do_remove в цикле while, который анализирует параметр командной строки, потому что я хочу контролировать порядок, в котором ls и rm имеют место дальше. Если пользователь использует -lp или -pl я хочу, чтобы они увидели содержимое каталога нежелательной -pl до его удаления.

Удаление каталога нежелательной -p с помощью -p также воссоздает его. Я делаю это с помощью rm -rf за которым следует mkdir для простоты.

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

Если нет позиционных аргументов ( $# равно нулю), я не пытаюсь запустить mv для перемещения файлов в каталог мусора.

  • Подготовьте ответы на вопросы команды
  • Как выполнить инкрементное резервное копирование на ленточном накопителе
  • Поиск файла на основе диапазона данных
  • Транспонирование трехмерного тензора, воспроизводимого файлами
  • Дэш-эквивалент саморасправки выхода скрипта
  • Как найти ответственный сценарий с результатами поиска?
  • Как использовать printf для отображения результатов расчета?
  • Можно ли использовать команды типа `fg` в shell-скрипте?
  • сумма всех пакетов в файлах pcap
  • Как анализировать команды из текстового файла в сценарий bash в CLI
  • Параметр одиночного кавычки сценария Bash с параметром globbing
  • Ожидание / dev / sda1, чтобы стать доступным, с таймаутом, в сценарии оболочки
  • Interesting Posts

    Использование «зарезервированных» кодов для статуса выхода сценариев оболочки

    Изменить домашний каталог на USB в Linux

    cd ~ работает в одном сеансе терминала, но не в другом (об ошибке не сообщается)

    Как настроить резервное копирование, если файловая система только для чтения

    Сохранять метаданные или редактировать метаданные с помощью tar

    Несколько туннелей SSH (локальная и удаленная переадресация) через одно master-соединение OpenSSH? Хорошая идея?

    Как настроить xorg.conf для широкоэкранного VNC на безголовом Linux / Ubuntu?

    Использует ли Gentoo Hardened -fstack-protector-сильный?

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

    Как получить относительные пути с помощью ls?

    Найти все абсолютные ссылки в дереве каталогов

    Автоматическое открытие kwallet при входе в KDE

    как сохранить данные в терминале в виде файла электронной таблицы

    Как извлечь определенные элементы из имени файла?

    Совместное использование сетевого диска между Linux и Windows

    Linux и Unix - лучшая ОС в мире.