Usando um loop de contador para variável de ambiente

2

Estou tentando escrever um código que mova arquivos para um diretório .junk usando as variáveis de ambiente integradas. Meu objetivo é que tudo que um usuário teria que fazer é digitar sh junk filename1 filename2 filename3 ... e o script usaria $ 1, $ 2, $ 3 ... para mover os arquivos. Infelizmente, não consigo fazer o loop do contador funcionar corretamente.

#!/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
    
por kstechboi 28.04.2014 / 23:10

2 respostas

0

Alguns problemas imediatos:

  1. Use getopts para processamento de argumentos ou tenha um motivo para não.
  2. Se o script receber mais de 1 argumento, o "$@" no terceiro elif aumentará.
  3. Use um loop for f in "$@" em vez de um loop while .

Por quê?

  1. O que acontece se você digitar sh junk --help ... ou alguma opção mv mais interessante?
  2. QED
  3. Mais simples = > Melhor
por 29.04.2014 / 07:06
0
#!/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 [ ! -d "$junkdir" ] && [ "$do_purge" -eq 0 ]; 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 [ "$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 [ "$#" -eq 0 ]; then
    exit
fi

echo 'Junking the following things:'
printf '%s\n' "$@"

mv "$@" "$junkdir"

Este script implementa o que você está tentando fazer. Ele usa getopts para analisar os sinalizadores de linha de comando -l e / ou -p .

Estou definindo do_list e do_purge no loop while que analisa a opção de linha de comando porque desejo controlar a ordem na qual o ls e o rm ocorrem mais abaixo. Se um usuário usar -lp ou -pl , eu quero que eles vejam o conteúdo do diretório de lixo eletrônico antes de ser removido.

A remoção do diretório de lixo eletrônico com -p também o recria. Eu faço isso com rm -rf seguido de mkdir para simplificar.

Após o loop de análise da linha de comando, eu ajustei os parâmetros posicionais para que eles contenham apenas argumentos não-opcionais (nomes de arquivos e / ou diretórios).

Se não houver argumentos posicionais ( $# é zero), não tento executar mv para mover arquivos para o diretório de lixo eletrônico.

    
por 07.09.2017 / 13:26