Valgmuligheder under kørsel af script
-
- Admin
- Indlæg: 10724
- Tilmeldt: 26. apr 2008, 19:27
- IRC nickname: Christian_Arvai
- Geografisk sted: Holeby - Lolland
Valgmuligheder under kørsel af script
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.:
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?
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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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
Som du kan se, så har jeg valgt at oprette den som en funktion i sig selv, det giver mig nemlig mulighed for at
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
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?
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?
-
- Indlæg: 2667
- Tilmeldt: 21. nov 2006, 10:06
- Geografisk sted: Fredericia
Re: Valgmuligheder under kørsel af script
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
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."
Kører LTS udgaverne.
"It's always easy if you know how to do it."
-
- 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
Jeg fandt lidt mere http://ubuntuforums.org/showthread.php?t=531144 og http://ubuntuforums.org/showthread.php?t=530833
Jeg kan så ikke få det til selv at fortsætte, efter at jeg først brugt "read -p".
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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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
hvis man ikke giver nogen parameter. Selve scriptet har
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.
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.
-
- 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
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
-
- 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
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
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
...
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.
-
- 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
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
-
- 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
TitanusEramius skrev:Det var det, ét stk fungerende script som tager imod ordrerKode: 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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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å
som giver
Faktisk giver scriptet det svar, medmindre at det kaldes med A, B eller C. Kører du det grafisk?
Kode: Vælg alt
sh test
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?
-
- 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
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
"We can only see a short distance ahead, but we can see plenty there that needs to be done." -- Alan Turing
-
- 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
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
og ser om det hjælper. Hvis det virker, så prøv med '<script> B' og '<script> C' også
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
-
- 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
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.
Hvem er online
Brugere der læser dette forum: Ingen og 0 gæster