Kirjoittaja Aihe: SH skripti ja FOR lauseke > Syntax error: Bad for loop variable  (Luettu 3026 kertaa)

iikoo

  • Käyttäjä
  • Viestejä: 6
    • Profiili
Pohjustus: kyseessä on VIA Epia SN mini-itx emolla ja Dell PERC 5/i RAID ohjaimella varustettu NAS projekti. Käyttiksenä on Ubuntu 9.04.

Jotta saisin LSI:n MegaRAID storage managerin toimimaan, käänsin .rpm paketin tämän ohjeen mukaisesti > http://ubuntuforums.org/showthread.php?t=781204

Homma onnistui melko helposti, ja sain uuden .deb paketin asennettua. Softa myös lähtee käyntiin, mutta sillä ei pääse korttiin kiinni ennen kuin käynnistää vivaldiframework palvelun.

Tässä tulikin sitten seinä vastaan. Kun yritän käynnistää /etc/init.d/vivaldiframeworkd:tä, niin kone herjaa yksinkertaisesti /etc/init.d/vivaldiframeworkd: 18: Syntax error: Bad for loop variable.

Tutkiskelin aikani sh:n ja bash:n ihmeellistä maailmaa, ja vaikuttaisi siltä, että sh ei tue tuota for lauseketta, joka rivillä 18 ilmenee:
Koodia: [Valitse]
for (( i=0 ; i<20 ; i++))
Kokeilin ajaa skriptin bashin läpi, jolloin skripti ei sinänsä herjaa mitään, mutta ei se myöskään käynnisty, eli tulee ilmoitus "Starting Framework:", ei muuta.

Ilmeisesti siis for lauseke ei toimi sh:n läpi, vaan se pitäisi korvata esim while lausekkeella, joka tekisi saman lopputuloksen.

Kuinka saisin skriptin toimimaan sh:n kanssa, hyviä vinkkejä tai arvauksia otetaan vastaan! :)

Tässä vielä koko vivaldiframeworkd skripti:
Koodia: [Valitse]
#!/bin/sh
#description: Framework serice startup/shutdown script

#Function to check status of Framework service
check_status() {
x=`ps -ef|grep java|grep Framework.jar`
if [ "$x" = "" ] ; then
return 3;
fi
return 0
}

#Function to start Framework service
start() {
\rm -f /tmp/network_present
. /etc/init.d/msm_profile
network_flag=0
for (( i=0 ; i<20 ; i++))
do
if [ -f "$MSM_HOME/Framework/TestNetworkCapability.class" ]
then
echo "$MSM_PRODUCT with Network Capability">>/tmp/vivaldi_startup.txt
"$MSM_HOME/jre/bin/java" -classpath "$MSM_HOME/jre/lib/rt.jar:$MSM_HOME/Framework" TestNetworkCapability
if [ -f /tmp/network_present ]
then
network_flag=1
i=21
\rm -f /tmp/network_present
else
sleep 5
fi
else
echo "$MSM_PRODUCT without Network Capability">>/tmp/vivaldi_startup.txt
network_flag=1
i=21
fi
done
if [ $network_flag -eq 1 ]
then
echo "Trying to start Framework.....">>/tmp/vivaldi_startup.txt
else
echo "$MSM_PRODUCT failed to start Framework..... Check your Network">>/tmp/vivaldi_startup.txt
echo "Trying to start Framework without Network Capability.....">>/tmp/vivaldi_startup.txt
fi
sh "$MSM_HOME/Framework/startup.sh" >> /tmp/vivaldi_startup.txt 2>>/tmp/vivaldi_startup.txt &
}

#function to stop Framework Service
stop() {
. /etc/init.d/msm_profile
sh "$MSM_HOME/Framework/shutdown.sh" >> /tmp/vivaldi_shutdown.txt &
}

case "$1" in
start)
check_status
status=$?
if [ $status = 0 ]; then
echo "Framework is already running....."
else
echo "Starting Framework: "
start
fi
;;
stop)
check_status
status=$?
if [ $status = 3 ]; then
echo "Framework is already stopped....."
else
echo "Shutting down Framework: "
stop
fi
;;
restart|reload)
$0 stop
sleep 20
$0 start
;;
status)
check_status
RETVAL=$?
if [ $RETVAL = 0 ]; then
echo "Framework is running..."
else
if [ $RETVAL = 3 ]; then
echo "Framework is stopped..."
else
echo "Framework status unknown..."
fi
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL


SuperOscar

  • Käyttäjä
  • Viestejä: 4064
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Kokeilin vähän... Tuo näyttää olevan Bash-laajennus, joten ”taikarivin” tulee kuulua

Koodia: [Valitse]
#!/bin/bash
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

iikoo

  • Käyttäjä
  • Viestejä: 6
    • Profiili
Kokeilin vähän... Tuo näyttää olevan Bash-laajennus, joten ”taikarivin” tulee kuulua

Koodia: [Valitse]
#!/bin/bash

Tuota on myös tullu kokeiltua, tekee saman mitä kun ajaa käsin bashin läpi alkuperäisen skriptin > tekee jotain, mutta ei aja mitään suoritteita mitä start | stop | reload | status hakevat...

iikoo

  • Käyttäjä
  • Viestejä: 6
    • Profiili
Eikun helvattu, nyt se toimiikin! En tiedä olinko aikaisemmin puusilmä vai mikä tuossa mätti, mutta iso kiitos SuperOscarille kuitenkin! ;D

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
jos tuon nyt jostain syysta pitäisi olla posix-yhteensopiva sh-scripti ilman bash-laajennoksia, niin tuon for-lausekkeen voisi kirjoittaa vaikka näin:
Koodia: [Valitse]
for i in `seq 19`
Janne