Hvorfor stopper dette 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.
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Hvorfor stopper dette script?

Indlæg af thj01 »

Jeg har lavet et script til at installere alt det jeg normalt bruger. Men det stopper lige før det skal installere Virtualbox.

Er det fordi der mangler et "sudo -E" foran?

Behøver jeg at skrive "&&" efter hver kommando eller er et linieskift nok?

Scriptet

Kode: Vælg alt

#!/bin/bash

# aktivere de forskellige repositories

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

#Aktivere medibuntu
#
#
#

sudo -E wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list && sudo apt-get --quiet update &&
sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring &&
sudo apt-get --quiet update

#Installer flash - forskel på 64bit og 32bit udg.
#
#
#

if [[ `uname -m` == 'x86_64' ]];
then
sudo apt-get install -y flashplugin-installer;
else
sudo apt-get install -y adobe-flashplugin;
fi

# Installer plugins, java, drivers og diverse codecs
#
#
#

sudo apt-get install -y icedtea-plugin adobe-flashplugin non-free-codecs ubuntu-restricted-extras libdvdcss2 vlc-plugin-pulse mozilla-plugin-vlc totem-plugins-extra

# Installer diverse programmer
#
# Heruder indsættes andre programmer der skal installeres fra start, og som ikke kræver ekstra ppa'er
#
# Skype - samtale/cam client
# vlc - video afspiller
# audacity - audio editor/recorder
# gparted - partitionmanager
# sysinfo - System informationer
# rar, p7zip - vigtige pakkeprogrammer
# Gnome-system-tools -
   # Users and groups
   # Date and time
   # Network configuration
   # Runlevels
   # Shared Folders through Samba or NFS
# geany - teksteditor
# inkscape - SVG editor


sudo apt-get install -y skype vlc audacity gparted sysinfo rar p7zip gnome-system-tools geany inkscape

#Installer diverse programmer i nyeste versioner - eller som ikke er med i grund repo's endnu

#gimp 2.8
sudo add-apt-repository -y ppa:otto-kesselgulasch/gimp &&

#Ubuntu-tweak
sudo add-apt-repository -y ppa:tualatrix/ppa &&

#Clip-grab
sudo add-apt-repository -y ppa:clipgrab-team/ppa &&

#Jupiter - strømstyringsprogram
sudo add-apt-repository -y ppa:webupd8team/jupiter &&

#system load indicator
sudo add-apt-repository -y ppa:indicator-multiload/stable-daily &&

#minetest - minecraft-clon
sudo add-apt-repository -y ppa:minetestdevs/daily-builds &&

#classicmenu-indicator
sudo apt-add-repository -y ppa:diesch/testing &&

#Nyeste pidgin
sudo apt-add-repository -y ppa:pidgin-developers/ppa

sudo apt-get update &&

sudo apt-get install -y gimp ubuntu-tweak clipgrab jupiter indicator-multiload minetestc55 classicmenu-indicator pidgin



#diverse programmer der kun kan hentes fra udbyder
#
#Herunder indsættes kommende ekstra programmer der kræver leverandør ppa'er
#

#VirtualBox
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add - &&
sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian precise contrib" >> /etc/apt/sources.list' &&

#Dropbox - bør måske fjernes til fordel for gdrive og UbuntuOne
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E &&
sudo sh -c 'echo "deb http://linux.dropbox.com/ubuntu/ precise main" >> /etc/apt/sources.list.d/dropbox.list' &&

#Google Chrome
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - &&
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' &&

#Spotify client
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4E9CFF4E &&
#sudo sh -c 'echo "deb http://repository.spotify.com stable non-free" >> /etc/apt/sources.list' &&

#sudo apt-get update &&

sudo apt-get install -y virtualbox-4.1 nautilus-dropbox google-chrome-stable spotify-client


exit0
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: 10725
Tilmeldt: 26. apr 2008, 19:27
IRC nickname: Christian_Arvai
Geografisk sted: Holeby - Lolland

Re: Hvorfor stopper dette script?

Indlæg af Christian.Arvai »

Godmorgen.

Jeg skal lige kigge lidt på det med VB. i aften, men du behøver ikke at sætte && til sidst - som du selv nævner er et linjeskift nok.
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
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Re: Hvorfor stopper dette script?

Indlæg af thj01 »

Så blev scriptet endeligt færdigt - og testet på 12.04.2 LTS ( trekvart år har også sin ret ;) )

Jeg overvejer om det skal smides op under opsætning, men der vil jeg lige have flere personers tanker.

Også hvis der skulle være nogen der ser at der mangler noget helt essentielt.

Kode: Vælg alt

#!/bin/bash

sudo apt-get update

sudo apt-get upgrade -y

# aktivere de forskellige repositories

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

#Aktivere medibuntu
#
#
#

sudo -E wget --output-document=/etc/apt/sources.list.d/medibuntu.list http://www.medibuntu.org/sources.list.d/$(lsb_release -cs).list
sudo apt-get --quiet update
sudo apt-get --yes --quiet --allow-unauthenticated install medibuntu-keyring
sudo apt-get --quiet update

#Installer flash - forskel på 64bit og 32bit udg.
#
#
#

if [[ `uname -m` == 'x86_64' ]];
then
sudo apt-get install -y flashplugin-installer;
else
sudo apt-get install -y adobe-flashplugin;
fi

# Installer plugins, java, drivers og diverse codecs
#
#
#

sudo apt-get install -y icedtea-plugin adobe-flashplugin non-free-codecs ubuntu-restricted-extras libdvdcss2 vlc-plugin-pulse mozilla-plugin-vlc totem-plugins-extra

# Installer diverse programmer
#
# Heruder indsættes andre programmer der skal installeres fra start, og som ikke kræver ekstra ppa'er
#
# Gimp
# Skype - samtale/cam client
# vlc - video afspiller
# audacity - audio editor/recorder
# gparted - partitionmanager
# sysinfo - System informationer
# rar, p7zip - vigtige pakkeprogrammer
# Gnome-system-tools -
   # Users and groups
   # Date and time
   # Network configuration
   # Runlevels
   # Shared Folders through Samba or NFS
# geany - teksteditor
# inkscape - SVG editor
# Phatch - foto batch behandler




sudo apt-get install -y gimp skype vlc audacity gparted sysinfo rar p7zip gnome-system-tools geany inkscape mypaint phatch

#Installer diverse programmer i nyeste versioner - eller som ikke er med i grund repo's endnu


#Ubuntu-tweak
sudo add-apt-repository -y ppa:tualatrix/ppa

#Clip-grab
sudo add-apt-repository -y ppa:clipgrab-team/ppa

#Jupiter - strømstyringsprogram
sudo add-apt-repository -y ppa:webupd8team/jupiter

#system load indicator
sudo add-apt-repository -y ppa:indicator-multiload/stable-daily

#classicmenu-indicator
sudo apt-add-repository -y ppa:diesch/testing

sudo apt-get update

sudo apt-get install -y ubuntu-tweak clipgrab jupiter indicator-multiload classicmenu-indicator





#diverse programmer der kun kan hentes fra udbyder
#
#Herunder indsættes kommende ekstra programmer der kræver leverandør ppa'er
#

#VirtualBox
sudo wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian precise contrib" >> /etc/apt/sources.list.d/virtualbox.list'

#Dropbox - bør måske fjernes til fordel for gdrive og UbuntuOne
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E
sudo sh -c 'echo "deb http://linux.dropbox.com/ubuntu/ precise main" >> /etc/apt/sources.list.d/dropbox.list'

#Google Chrome
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

#Spotify client
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4E9CFF4E &&
#sudo sh -c 'echo "deb http://repository.spotify.com stable non-free" >> /etc/apt/sources.list' &&

sudo apt-get update

sudo apt-get install -y virtualbox-4.2 dropbox google-chrome-stable

sudo apt-get update

sudo apt-get upgrade -y

exit0
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."
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Hvorfor stopper dette script?

Indlæg af lath »

Hej thj01

Undskyld hvis jeg er lidt hård herunder, men din kode er ikke så elegant skrevet, hvilket sikkert bare skyldes manglende viden.
Da man ikke kan vide alt, fortæller jeg dig nu hvordan du kan lave det bedre - om du så vil bruge det eller ej er op til dig selv.

Dit script kan laves meget kønnere.
Fejlen du har begået kaldes copy-paste programmering, fordi du har gentaget det samme mønster i koden mere end 1 gang.

Hvis du kigger på de 2 her kommandoer, hvad er så ens?
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

Vi har flere ens dele:
1)
echo "deb http://archive.canonical.com/ubuntu/ $(lsb_release -cs) "
2)
> /etc/apt/sources.list

Den eneste forskel imellem dem er : " partner", og " updates partner".

Hvorfor er det galt at lave koden som du har lavet det?
Jo, hvis du skal skifte arkiv så skal du gøre det mange steder i koden i stedet for kun at gøre det 1 sted.
Det vil sige at du laver en variabel til at præsentere arkiv, lsb_release, og til hvilket fil (lige nu er det /etc/apt/sources.list) echo skal appende resultatet til.

Kort sagt kandiderer forskellene til at blive lagt i et array, hvor man så laver en funktion der kører kommandoen ud fra den her template :

Kode: Vælg alt

deb_cmd=deb $arkiv $lsbreleasecs $array[i]
echo "$deb_cmd" > $filnavn

hvor arkiv, lsbreleasecs, og filnavn er:

Kode: Vælg alt

arkiv=http://archive.canonical.com/ubuntu/
lsbreleasecs=$(lsb_release -cs)
filnavn=/etc/apt/sources.list

og array[i] er det i'te index i arrayet der hedder "array". For eksempel så returnerer $array[i], hvor i = 0 (nul) tekststrengen " partner", men hvis i=1 så returneres der " updates partner".
På den måde har du fuldstændigt genskabt indholdet af din oprindelige kode, men skulle nogle af de ting hvor du bruger være et variabelnavn i templaten der har ændret sig, kan du nu nøjes med kun at rette i koden et eneste sted for at det slår igennem overalt i scriptet.


Herunder har jeg et andet eksempel med dine sudo apt-get kommandoer:

Alle apt-get kommandoers "kommando pakke1 pakke2 ... pakkeN" eller "kommando argumet1 argument2 ... argumentN" kan du proppe ind i en tekststreng.
Du laver så et array/en liste af de kommandoer der skal køres.

Når du så vil køre en bunke kommandoer kører du dem i en loop fra et start index til et slut index.

Hele loopet kan du meget praktisk proppe ind i en funktion som du så bruger når det er nødvendigt i scriptet.
Funktionen laves sådan at vi kan bruge en reference til forskellige arrays i den samme funktion.

Det ser ca sådan her ud (jeg bruger JavaScript lignende pseudokode - altså ikke rigtig bash scripting kode som jeg ikke er så meget inde i):
Din første 2 kommandoer er sudo apt-get update og sudo apt-get upgrade -y, så i vores array starter vi med at skrive:

Kode: Vælg alt

var apt_get_cmds = new Array();
apt_get_cmds[0] = "update";
apt_get_cmds[1] = "upgrade -y";

//vores loop funktion:
apt_cmd_loop(array_var, start_index, stop_index) /*array_var er en reference til vores array - ingen grund til at binde funktionen fast til kun 1 array */
{
// FIXME: her laves kode der tjekker for indeks-fejl (array out of bounds)
for (i=start_index;i <= slut_index;i++)
{
var sys_string  = "sudo apt-get " + array_var[i];
system (sys_string);
}
}


Funktionen kan du i øvrigt lave fuldstændig generisk (universelt anvendeligt til at loope over noget) ved at du fortæller hvilket array der skal bruges, hvorfra og hvortil i arrayet der skal laves noget, og til sidst hvilken funktion der skal køres for hvert loop.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Re: Hvorfor stopper dette script?

Indlæg af thj01 »

@lath
Jeg ved NADA om script skrivning, så jeg vil da nærlæse det du har skrevet grundigt - for vil da gerne have at det står smartere ;)

Mine kodningsevner starter og slutter ved HTML5, CSS, jquery og JqueryMobile (og selv der er det rudimentært gg) og jeg kan til nøds lige ændre parametre i JS-kode-

Kigger på det lidt senere - og håber på at jeg lære det lidt bedre at kende ..
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
NickyThomassen
Admin
Indlæg: 3652
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Re: Hvorfor stopper dette script?

Indlæg af NickyThomassen »

Da jeg skiftede til Linux i 2009, startede jeg næsten med det samme med at lave små og simple programmer i SH. Ikke noget voldsomt, bare småting til at gøre hverdagen lidt nemmere. Fx

Kode: Vælg alt

titanus@asrock:~$ cat /usr/local/bin/aptget 
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade
Alt hvad det gør, er at spare mig én kommando når jeg gerne vil opdatere fra terminalen.

Ved at eksperimentere mig frem, er programmerne stille og roligt vokset

Kode: Vælg alt

titanus@asrock:~$ cat /usr/local/bin/update-postfix-guide 
#!/bin/bash

rsync -avz -e 'ssh -pXXX' --delete-after --progress --bwlimit=40 \
/home/titanus/Linux/Ubuntu/postfix/ \
titanus@31.192.231.5:/home/www/postfix/

exit 0
(-pXXX er portnummeret)

Og vokset

Kode: Vælg alt

titanus@asrock:~$ cat /usr/local/bin/mkp 
#/bin/bash

if [ -e "/usr/bin/which" ] ; then
   WHICH="/usr/bin/which"
else
   echo "which ikke fundet, afslutter..." > /dev/stderr
   exit 10
fi
MKPWD=$($WHICH makepasswd)
if [ "$?" -ne "0" ] ; then
   echo "makepasswd ikke fundet, prøver og installere det nu..." > /dev/stderr
   echo
   echo "Tryk CTRL+C for at afbryde"
   sudo apt-get install makepasswd
fi
if [ -z $MKPWD ] ; then
   MKPWD=$($WHICH makepasswd)
   if [ "$?" -ne "0" ] ; then
      echo "makepasswd ikke installeret, afslutter..." > /dev/stderr
      exit 10
   fi
fi
clear
while [ $# -ne 0 ] ; do
   PARAM="$1"
   shift
   case "$PARAM" in
      -r|run)
      case $1 in
         *[!0-9]* | "")
         echo "{ $PARAM } må ikke være tom, og skal efterfølges af ét eller flere tal."
         echo "Se evt. { $(basename $0) -o } for detaljer."
         exit
         ;;
         *)
         RUN=$1
         shift
         ;;
      esac
      ;;
      -l|længde)
      case $1 in
         *[!0-9]* | "")
         echo "{ $PARAM } må ikke være tom, og skal efterfølges af ét eller flere tal."
         echo "Se evt. { $(basename $0) -o } for detaljer."
         exit
         ;;
         *)
         LENGTH=$1
         shift
         ;;
      esac
      ;;
      -o|om|*)
      echo " --- $(basename $0) er en wrapper til programmet makepasswd --- "
      echo "Gyldig brug af programmet er:"
      echo
      echo "{ -l | længde } sætter hvor lange kodeordene skal være"
      echo "{ -r | run } sætter hvor mange kodeord der skal generes"
      echo "{ -o | om } viser denne hjælpetekst"
      echo
      echo "Kaldes programmet uden nogen parametre, så vil ét kodeord"
      echo "på 15 tegn blive generet."
      exit 0
      ;;
   esac
done
if [ -z $LENGTH ] ; then
   LENGTH=15
fi
if [ -z $RUN ] ; then
   RUN=5
fi
echo "Kører { $MKPWD --chars $LENGTH } $RUN gange nu..."
echo
START=$(date +%s.%N)
while [ "$RUN" -ne "0" ] ; do
   $MKPWD --chars $LENGTH
   RUN=$((RUN-1))
   if [ $LENGTH -ge 81 ] ; then
      echo
   fi
done
STOP=$(date +%s.%N)
echo && echo "Gennemført på $(echo $STOP - $START | bc) sekunder"
exit 0

Idag kan jeg også Perl og en smule PHP, og det hele startede med aptget-programmet :)