Valgmuligheder under kørsel af script

Dette forum bruges på EGET ANSVAR til at lege med scripts og andre ting med risiko for at beskadige sit eget og andres systemer.
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

Nu da vi er flere der hygger os med scripts, kan vi jo lige prøve at gøre dem lidt mere avancerede ;)

Jeg vil gerne have bygget valgmuligheder ind i et script, sådan at man kan vælge Y/N ved f.eks.:

Kode: Vælg alt

echo "Tilføjelser af softwarekilder."
echo ""
echo "EN ELLER ANDEN ADVARSEL, OM AT LISTEN OVERSKRIVES VED JA"
echo "Vil du overskrive listen?. y/n"
if [[ `INPUT FRA Y/N` == 'y' ]];
then
echo "deb http://archive.canonical.com/ubuntu/ $(lsb_release -cs) partner" > /etc/apt/sources.list
echo "deb http://archive.canonical.com/ubuntu/ $(lsb_release -cs)-updates partner" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs) multiverse" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-updates multiverse" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs) main restricted" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-updates main restricted" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs) universe" >> /etc/apt/sources.list
echo "deb http://dk.archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-updates universe" >> /etc/apt/sources.list
sudo apt-get update -y
echo ""
echo "Udført.
else
echo "Tilføjelser af softwarekilder blev fravalgt."
fi


Da scriptet jo fortsætter, skal valget kun give indflydelse på de viste linier, og derefter skal det bare kører videre. Nogle gode ideer?
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

Jeg har altid (det lyder så flot ;) ) brugt en form for logik, der sikkert ikke er logisk for andre.

Den præcise J/N-kode i sh er

Kode: Vælg alt

# Ja / nej funktion
valg_janej() {
    # Gentag hvis ikke der svares ja /nej
    while true
    do
        #$* read ever parameter giving to the yesNo function which will be the message
        echo -n "$* (J/N)? "
        # junk holds the extra parameters yn holds the first parameters
        read jn junk
        #check for difference cases
        case $jn in
            ja|Ja|JA|j|J)
                return 0
                ;;
            nej|Nej|NEJ|n|N)
                return 1
                ;;
        esac
    done   
}

Som du kan se, så har jeg valgt at oprette den som en funktion i sig selv, det giver mig nemlig mulighed for at

Kode: Vælg alt

# Tjek for ja / nej svar
if valg_janej 'Skal noget ekstra køres her?'
then
noget_ekstra
noget_andet
else
noget_andet
fi

noget_ekstra og noget_andet er bare to andre funktioner, som er defineret inden ja/nej-funktionen. Efter at jeg fik ja / nej til at virke, har jeg tilgengæld prøvet at gennemskue hvordan man laver flere ja / nej'er, men svaret er undsluppet mig indtil videre.

Lad os sige, at vi har 3 ting man kan vælge imellem, nemlig A, B og C. De kunne fx være backup 3 forskellige steder. Man kunne sagtens lave en underlig menu

Kode: Vælg alt

echo "Hvad vil du tage backup af?"
(noget choice-kode her)
1 A
2 B
3 C
4 A & B
5 A & C
...

Ikke just optimalt... Smartere ville det være hvis man i stedet fik 3 spørgsmål i træk, hvor der først bliver spurgt J/N til A, så til B og til sidst C. Man kunne godt præsentere ja / nej 3 forskellige steder i scriptet, men det er heller ikke smart, for så skal man sidde ved computeren, og holde øje med hvad den laver. Et rigtigt script tager sine valg i starten, så brugeren ikke skal andet end at starte det op :)

Noget andet jeg også syntes mangler i ihvertfald mine scripts, er ordentlig håndtering af fejl, og ikke mindst at scriptet skriver hvorhenne det fejlede. Er der nogen af jer der bruger det / ved hvordan det virker?
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Re: Valgmuligheder under kørsel af script

Indlæg af thj01 »

Jeg får simpelthen ticks af den slags scripts. For hvis jeg kører et script så skal det bare køre. Det giver mig dårlige minder om dengang man sad og lavede scripts til DOS.

Noget andet er hvis scriptet bliver lavet, så man kan aktivere valgmulighederne med tags/flags efter kommandoen. Så ville man kunne lave et motherfucking sejt script, der kunne det meste.

Og der kunne man lave scripts der var specialdesignet,

F.eks.
-th : thj01's choices
-ar : Arvais best
-te TitanusEramius classic
Forfatter til Ubuntuguiden: http://www.vidas.dk/guides/ubuntuguiden.html

Kører LTS udgaverne.

"It's always easy if you know how to do it."
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

Jeg fandt lidt mere http://ubuntuforums.org/showthread.php?t=531144 og http://ubuntuforums.org/showthread.php?t=530833

Kode: Vælg alt

#!/bin/bash
echo hey!
read -p "write 'gooba gooba gooba' (y/n)?"
[ "$REPLY" == "y" ] || echo "gooba gooba gooba"
read -p "Install YYY (y/n)?"
[ "$REPLY" == "y" ] || sudo apt-get install YYY

Jeg kan så ikke få det til selv at fortsætte, efter at jeg først brugt "read -p".
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

thj01 skrev:Jeg får simpelthen ticks af den slags scripts. For hvis jeg kører et script så skal det bare køre. Det giver mig dårlige minder om dengang man sad og lavede scripts til DOS.

Det jeg pt arbejder ud fra, er at lave 2 spørgsmål lige i starten af scriptet, om tilføjelser af softwarekilder og install af spil. Dette skyldes, at jeg bruger scriptet både på min og andres pc'er, så jeg vil gerne have muligheden for ikke at overskive softwarekilderne. Valgmuligheden om "spil" skyldes at jeg har en pæn liste, med ca 3,5GB der skal hentes, hvilket jeg gerne vil kunne fravælge, primært fordi at det tager vildt langt tid, hvis jeg gør det på en release dag.
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

TitanusEramius skrev:Noget andet jeg også syntes mangler i ihvertfald mine scripts, er ordentlig håndtering af fejl, og ikke mindst at scriptet skriver hvorhenne det fejlede. Er der nogen af jer der bruger det / ved hvordan det virker?

Hvis du opretter en tråd om det, har jeg nok svaret ;)
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

Man kan altid stole på at TLDP har noget om emnet, men jeg syntes ikke at det giver meget mening...
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html

Så jeg åbnede isteden /etc/init.d/xdm (jeg sidder på Debian med XDM som desktop-manager) og den siger

Kode: Vælg alt

titanus@debie:~$ sudo /etc/init.d/xdm
[sudo] password for titanus:
Usage: /etc/init.d/xdm {start|stop|restart|reload|force-reload|status}

hvis man ikke giver nogen parameter. Selve scriptet har

Kode: Vælg alt

#!/bin/sh

# Copyright 1998-2002, 2004, 2005 Branden Robinson <branden@debian.org>.
# Copyright 2006 Eugene Konev <ejka@imfi.kspu.ru>
#
# This is free software; you may redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2,
# or (at your option) any later version.
#
# This is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License with
# the Debian operating system, in /usr/share/common-licenses/GPL;  if
# not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA

### BEGIN INIT INFO
# Provides:          xdm
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      xfs $named slapd hal
# Should-Stop:       xfs $named slapd hal
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: The X Display Manager
### END INIT INFO

set -e

# To start xdm even if it is not the default display manager, change
# HEED_DEFAULT_DISPLAY_MANAGER to "false."
# Also overridable from command line like:
# HEED_DEFAULT_DISPLAY_MANAGER=false /etc/init.d/xdm start
[ -z "$HEED_DEFAULT_DISPLAY_MANAGER" ] && HEED_DEFAULT_DISPLAY_MANAGER=true

DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/bin/xdm
PIDFILE=/var/run/xdm.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

# If we have upgraded the daemon since we last started it, we can't use the
# --exec argument to start-stop-daemon, because the daemon's inode will have
# changed.  The risk here is that in a situation where the daemon died, its
# pidfile was not cleaned up, we've upgraded it, *and* some other process is now
# running under that pid, start-stop-daemon will send signals to an innocent
# process.  However, this seems like a corner case.  C'est la vie!
# Update: --name should prevent signalling innocent processes.
SSD_START_ARGS="--pidfile $PIDFILE --name $(basename $DAEMON) --startas $DAEMON"
SSD_STOP_ARGS="--pidfile $PIDFILE --name $(basename $DAEMON) --retry TERM/5/TERM/5"
SSD_RELOAD_ARGS="--pidfile $PIDFILE --name $(basename $DAEMON) --signal 1"

case "$1" in
  start)
    if [ "$HEED_DEFAULT_DISPLAY_MANAGER" = "true" ] &&
       [ -e $DEFAULT_DISPLAY_MANAGER_FILE ] &&
       [ "$(cat $DEFAULT_DISPLAY_MANAGER_FILE)" != "$DAEMON" ]; then
      echo "Not starting X display manager (xdm); it is not the default" \
        "display manager."
    else
      log_daemon_msg "Starting X display manager" "xdm"
      start-stop-daemon --start --quiet $SSD_START_ARGS \
        || log_progress_msg "already running"
      log_end_msg 0
    fi
  ;;

  restart)
    /etc/init.d/xdm stop
    [ -f $PIDFILE ] && exit 1
    /etc/init.d/xdm start
  ;;

  reload)
    log_daemon_msg "Reloading X display manager configuration..."
    if ! start-stop-daemon --stop --quiet $SSD_RELOAD_ARGS; then
      log_progress_msg "not running."
    fi
    log_end_msg 0
  ;;

  force-reload)
    /etc/init.d/xdm reload
  ;;

  stop)
    log_daemon_msg "Stopping X display manager" "xdm"
    if ! [ -f $PIDFILE ]; then
      log_progress_msg "not running ($PIDFILE not found)"
    else
      start-stop-daemon --stop --quiet $SSD_STOP_ARGS
      SSD_RES=$?
      if [ $SSD_RES -eq 1 ]; then
        log_progress_msg "not running"
      fi
      if [ $SSD_RES -eq 2 ]; then
        log_progress_msg "not responding to TERM signals"
      else
   if [ -f $PIDFILE ]; then
     log_progress_msg "(removing stale $PIDFILE)"
     rm $PIDFILE
   fi
      fi
    fi
    log_end_msg 0
  ;;

  status)
   status_of_proc -p $PIDFILE $DAEMON xdm && exit 0 || exit $?
  ;;

  *)
    echo "Usage: /etc/init.d/xdm {start|stop|restart|reload|force-reload|status}"
    exit 1
    ;;
esac

exit 0

# vim:set ai et sts=2 sw=2 tw=80:

Og der har vi dem:
start)
restart)
reload)
force-reload)
stop)
status)
*)

Det er satanedmer smart :)

Det sker oftere og oftere at jeg lære mere her, end ovre på HF.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

christian.arvai skrev:
TitanusEramius skrev:Noget andet jeg også syntes mangler i ihvertfald mine scripts, er ordentlig håndtering af fejl, og ikke mindst at scriptet skriver hvorhenne det fejlede. Er der nogen af jer der bruger det / ved hvordan det virker?

Hvis du opretter en tråd om det, har jeg nok svaret ;)

Gjort https://ubuntudanmark.dk/forum/viewtopic.php?f=33&t=16139 :)
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

thj01 skrev:Jeg får simpelthen ticks af den slags scripts. For hvis jeg kører et script så skal det bare køre. Det giver mig dårlige minder om dengang man sad og lavede scripts til DOS

Sådan et har jeg tilfældigvis liggende :D

Kode: Vælg alt

@echo off

:tilbage
cls
echo Valg af diskette-drev til sikkerheds-kopiering af Mix filer
echo 1...Drev A
echo 2...Drev B
echo 3...Afslut
choice /c:123
if errorlevel 3 goto slut
if errorlevel 2 goto b
if errorlevel 1 goto a
...
(hmm, gedit understøtter faktisk formatet...)

Men jeg vil give dig ret, de (programmerings)dage savner jeg heller ikke. Jeg tror at løsningen som bruges af init-scriptene, vil fungere ret godt. Så kan man bare kalde hvad man har brug for, og scriptet behøves på ingen måde være begrænset til kun backup eller oprydning eller tilsvarende.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

Det var det, ét stk fungerende script som tager imod ordrer

Kode: Vælg alt

#!/bin/bash

echo "Inden case"
case "$1" in

   A)
   echo "case A valgt"
   exit 0
   ;;

   B)
   echo "case B valgt, fortsætter uden exit i case"
   ;;

   C)
   echo "case C valgt"
   exit 0
   ;;

   *)
   echo "Bruges <script-navn> {A|B|C}"
   exit 0
   ;;

esac

echo "Efter esac"
exit 0
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

TitanusEramius skrev:Det var det, ét stk fungerende script som tager imod ordrer

Kode: Vælg alt

#!/bin/bash

echo "Inden case"
case "$1" in

   A)
   echo "case A valgt"
   exit 0
   ;;

   B)
   echo "case B valgt, fortsætter uden exit i case"
   ;;

   C)
   echo "case C valgt"
   exit 0
   ;;

   *)
   echo "Bruges <script-navn> {A|B|C}"
   exit 0
   ;;

esac

echo "Efter esac"
exit 0


Hmmm, terminalen lukker lige med det samme.
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

Meget underligt. Det eneste jeg har gjort, har været at kopiere det præcise indhold fra mit script, med navnet 'test', herover. For at køre det kalder jeg så

Kode: Vælg alt

sh test
som giver

Kode: Vælg alt

Inden case
Bruges <script-navn> {A|B|C}

Faktisk giver scriptet det svar, medmindre at det kaldes med A, B eller C. Kører du det grafisk?
Brugeravatar
Christian.Arvai
Admin
Indlæg: 10724
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Valgmuligheder under kørsel af script

Indlæg af Christian.Arvai »

Kører du det grafisk?

Ja, og det skulle scriptet også gerne kunne.
Med venlig hilsen Christian

"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

Jeg kunne forestille mig, at scriptet bliver kørt som det skal. Det eneste det gør er jo at vise lidt tekst.

Den her type af script, er nok nød til at blive starte fra terminalen, for du skal videregive nogle parametre til det. Prøv og start det fra terminalen med

Kode: Vælg alt

<script> A
og ser om det hjælper. Hvis det virker, så prøv med '<script> B' og '<script> C' også :)
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Valgmuligheder under kørsel af script

Indlæg af NickyThomassen »

thj01 skrev:Jeg får simpelthen ticks af den slags scripts.

Jeg tror faktisk, at jeg fandt et sted i det nye backupscript, hvor en choice har sin plads:

Kode: Vælg alt

data() {
rsync --delete-after -avz \
(nogen data)
/media/backup/data/
}

back_data() {
if cat /proc/mounts | grep '/media/data' > /dev/null;
then
data
else
while true
   do
   # $* read læser de givne parametre
   clear
   echo
   echo -n "/media/data er ikke tilstede, vil du fortsætte med at køre backup uden?"
   # jn holder de første to parametre, junk resten
   read jn junk
   # Tjek for forskellige udtryk
      case $jn in
      ja|Ja|JA|j|J)
      data
      break
      ;;
      nej|Nej|NEJ|n|N)
      exit 12
      ;;
      esac
   done
fi
}

Men jeg er stadig enig i, at hvis et script stopper op og spørger om noget, så kunne det sikkert have været lavet lidt bedre. I den her situation mener jeg dog at det er pest eller kolera:
Enten skal scriptet køre videre, og risikere at brugeren (mig), ikke opdager at (nogen data) ikke blev sikkerhedskopieret.
Ellers skal det stoppe, og dermed forhindre brugeren i at sikkerhedskopier resten, hvilket heller ikke er optimalt.

Problemet er nok ikke så stort for interne data, men er de eksterne, så er der vel en fair chance for at de ikke er forbundet fra tid til anden.