2013-05-06 6 views
8

Próbuję zebrać dane wprowadzone przez użytkownika w shellscript ryb, szczególnie z poniższego formularza często widziany:Jak uzyskać potwierdzenie użytkownika w muszli rybnej?

This command will delete some files. Proceed (y/N)? 

Po niektóre wyszukiwanie wokół, wciąż nie jestem pewien jak to zrobić czysto.

Czy jest to specjalny sposób robienia tego w przypadku ryb?

Odpowiedz

14

Najlepszym sposobem, jaki znam, jest użycie wbudowanego read. Które niestety nie może wziąć ciąg znaków, ale zamiast tego przyjmuje funkcję. Jeśli używasz tego w wielu miejscach można utworzyć tę funkcję pomocnika:

function read_confirm 
    while true 
    read -l -p read_confirm_prompt confirm 

    switch $confirm 
     case Y y 
     return 0 
     case '' N n 
     return 1 
    end 
    end 
end 

function read_confirm_prompt 
    echo 'Do you want to continue? [y/N] ' 
end 

i używać go tak jak to w skryptach/funkcje:

if read_confirm 
    echo 'Do stuff' 
end 

zobacz dokumentację po więcej informacji: http://fishshell.com/docs/2.0/commands.html#read

+3

Właściwie, argumentem do '-p' może być dowolne polecenie powłoki, które zostanie poddane procesowi tokenu, tak jak można się było spodziewać w przestrzeniach, np. 'echo" Usuń pliki? [T/n]: "" Z połączonego dokumentu: "-p PROMPT_CMD lub --prompt = PROMPT_CMD używa wyjścia polecenia powłoki PROMPT_CMD jako zachęty do trybu interaktywnego. komenda to 'set_color green, echo read; set_color normal; echo"> "' –

+0

To działało dla mnie jednak prompt sugeruje, że tak jest domyślnie, jednak instrukcja switch będzie interpretowana jako pusta jako nr – JonoCoetzee

+0

Również 'read_confirm; i echo 'Do stuff '' – Pysis

4

Działa to tak samo, jak wybrana odpowiedź, ale z jedną funkcją, wydaje się być czystsze:

function read_confirm 
    while true 
    read -p 'echo "Confirm? (y/n):"' -l confirm 

    switch $confirm 
     case Y y 
     return 0 
     case '' N n 
     return 1 
    end 
    end 
end 

Funkcja podpowiedzi może być wstawiona jako taka.

2

Oto wersja z opcjonalnym, niewykonaniem wierszu:

function read_confirm --description 'Ask the user for confirmation' --argument prompt 
    if test -z "$prompt" 
     set prompt "Continue?" 
    end 

    while true 
     read -p 'set_color green; echo -n "$prompt [y/N]: "; set_color normal' -l confirm 

     switch $confirm 
      case Y y 
       return 0 
      case '' N n 
       return 1 
     end 
    end 
end 
1

Z pomocą niektórych wtyczek ryb fisherman i get

Aby zainstalować zarówno po prostu w swojej skorupie ryb

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher 
. ~/.config/fish/config.fish 
fisher get 

możesz napisać coś takiego w swojej funkcji/skrypcie

get --prompt="Are you sure [yY]?:" --rule="[yY]" | read confirm 
switch $confirm 
    case Y y 
    # DELETE COMMAND GOES HERE 
end 
Powiązane problemy