Jak analizować metaznaki w celu wprowadzenia funkcji w bashu?

0

Napisałem funkcję w bashu, która pobiera * jako dane wejściowe i dlatego powinna wyświetlić wszystkie pliki w tym konkretnym katalogu. ale nie. Oto co napisałem:

    # a function that mass deletes files in a directory but asks before deleting
    yrm()
    {
    echo "The following files are going to be deleted:"
    ls "${1}"
    read -e -n 1 -p "Do you want to delete these files? Y/n" ANSWER
    ${ANSWER:="n"} 2> /dev/null 

    if [ $ANSWER == "Y" ]
        then
            rm $1
        else
            echo "aborted by user"

    fi

}

Jednak przetestowałem go z tymi plikami:

l1zard@Marvin:~/.rclocal/test$ ls *
test1.txt  test2.txt  test3.txt  test5.txt  test7.txt  test8.txt  test9.txt  testm7m767.txt

i otrzymuję ten wynik z mojej funkcji:

l1zard@Marvin:~/.rclocal/test$ yrm *
The following files are going to be deleted:
test1.txt
Do you want to delete these files? Y/nn
aborted by user

Jak mogę to naprawić, aby wyświetlał pliki zgodnie z oczekiwaniami?

l1zard
źródło

Odpowiedzi:

2

spróbuj czegoś takiego:

ls "$@"
read ...
if [ "${ANSWER:=n}" = Y ]
then
  rm "$@"

Ale musisz także sprawdzić, czy pliki zostały określone i czy istnieją.

Scrutinizer
źródło
Tak, działa z $ @. Dzięki.
l1zard
Udało mi się też nieco skrócić funtoion:
l1zard
0

Funkcja wygląda teraz tak i działa dzięki Scrutinizer:

# a function that mass deletes files in a directory but asks before realy delting those
yrm()
{
echo "The following files are going to be deleted:"
ls "$@"
rm -rI "$@"
}
l1zard
źródło
1
Przyczyną jest to, że funkcja działa nie otrzymać * jako parametr: powłoka rozszerza gwiazdkę przed wywołaniem funkcji. Zobacz rozszerzenia część podręcznika bash.
glenn jackman
Cóż, jest to trochę niewygodne, ale wiedziałem o $ @ i $ *, ale nie rozważałem jego użycia. Jeszcze raz dziękuję za całą pomoc.
l1zard