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

Я пытаюсь написать код, который перемещает файлы в каталог .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 

  • Как переименовать все файлы со специальными символами и пробелами в каталоге?
  • Проверьте зависимости bash / shell
  • Shell Scripting: как использовать часть пути к файлу в качестве имени файла?
  • Отображать время работы cron в удобном для пользователя формате
  • проблема с Else statment в Bash
  • Почему у меня есть другой статус выхода для ps | grep в скрипте?
  • печать цветного текста с использованием эха
  • Файлы без расширения .sh, не считающиеся для автозаполнения в zsh
  • 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 для перемещения файлов в каталог мусора.

    Interesting Posts

    наверх, не показывая использование памяти кошки

    Последствия наличия переменной переменной $ PATH?

    Как сопоставить параметр и заменить значение после разделителя «=»

    Заменить значения на основе соответствия переменной ID

    Правила IPTables для маршрутизации трафика VPN через прокси-сервер

    X11 управляет корневым окном или устанавливает окно как фоновое окно (обои)

    RHEL: не может использовать утилиту ipset с ошибкой: не удается открыть сеанс для ядра

    Удалите слова (буквы, за которыми следует пробел) из определенного столбца

    Передача всех файлов определенного типа файлов в текущие и подкаталоги

    Lubuntu + pulseaudio

    Отсутствует файл конфигурации для SSSD?

    Как заблокировать исходящие подключения от процесса / пользователя на FreeBSD?

    использование sudoers, чтобы позволить привилегированному пользователю перезапустить apache

    Сценарий не запускается cron

    Как установить xfontsel на Fedora 13? Любая альтернатива?

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