Liste filer i case switch - Map filnavn til nummer

peque
Antal: 918
Tilmeldt:
20-04-2005
User is offline
Liste filer i case switch - Map filnavn til nummer

Hey gruppe.
Jeg nørder lidt med et lille bashscript som jeg gerne vil lave følgende ud af :

Jeg har et bibliotek på en maskine - /mnt/firmware - dette er roden af et NFS share. I denne mappe ligger andre mapper - kaldet :
FW04 - FW11 - inde i disse mapper ligger en fil med saamme navn dog som *img file

Jeg vil så gerne liste alle de filer - der slutter med *.img og putte disse ind i en case switch
dvs at jeg får en liste retur ala dette:

Choose the image to write to SD-card:
1. FW04
2. FW11
osv
- type the number of the image ?

Reelt set vil jeg gerne have folk indtaster et nummer frem for et helt filnavn - derfor denne case switch
jeg har fundet dette på google - men det vil ikke helt fungere som jeg vil:

echo -e "Listing all Image files in NFS share: "
unset options i
while IFS= read -r -d $'\0' f; do
  options[i++]="$f"
done < <(find $MNT -maxdepth 1 -type f -name "*.img" -print0 )
select opt in "${options[@]}" "Stop the script"; do
  case $opt in
    *.img)
      echo "Image file $opt selected"
      # processing
      ;;
    "Stop the script")
      echo "You chose to stop"
      break
      ;;
    *)
      echo "This is not a number"
      ;;
  esac
done

Men får så følgende error:
syntax error near unexpected token `do'
`select opt in "${options[@]}" "Stop the script"; do'

Er der nogle der kan hjælpe med hvor denne fejl er
Så vidt jeg kan komme frem til - er dette pga select ikke er muligt i denne firmware - så er der en anden måde at lave denne liste


quap
quap's picture
Antal: 117
Tilmeldt:
09-11-2004
User is offline
Hej peque,Ingen syntaxfejl

Hej peque,

Ingen syntaxfejl på min maskine, sikker på at din MNT variabel er defineret?

Venlig Hilsen
qUAp


peque
Antal: 918
Tilmeldt:
20-04-2005
User is offline
Nå har kæmpet lidt med

Nå har kæmpet lidt med dette og komme frem til følgende kan nogenlunde lade sig gøre
jeg kan liste mine *img filer og skrive dem ned til en txt fil = t.txt
Min tekst fil ender med at se således ud:

1) FW04.img
2) FW11.img

jeg kan udfra min commandline - køre kommanodoen : awk -F" * )*" '{if ($1==1) print $2}' ./t.txt
som giver mig svaret : FW04.img --> korrekt
Men når jeg bruger det i mit script ser hele linjen således ud:

MNT="/mnt/firmware/FW*/*.img"
SUM='1'
for entry in `ls $MNT`; do
        TEST=`echo $entry | rev | cut -d'/' -f 1 | rev `
        echo "$SUM) $TEST" >> t.txt
        let $((SUM++))
done
cat t.txt
echo -e "Choose a number?"
read ANS
case $ANS in
        $ANS)
        FILE=`awk -F" * )*" '{if ($1==$ANS) print $2}' ./t.txt`  <-- Denne linje giver mig ikke noget
        echo -e "chosen file $FILE"
        ;;
        *)
        echo -e "exit the script"
        ;;
esac

Når scriptet køres - får jeg dette
./test.sh
1) FW11_4_8202_Codesys23_IP_0_3_v1.img
2) FW11_4_8202_Maersk_v3.img
Choose a number?
1
chosen file

Men kører jeg min awk kommando manuelt - virker den fint


peque
Antal: 918
Tilmeldt:
20-04-2005
User is offline
Har fundet ud af mit problem

Har fundet ud af mit problem som skrevet er select IKKE findes i dette PLC image !
derfor har jeg prøvet på anden måde at komme uden om dette - Men syntes ikke min AWK kommando er skrevet korrekt i scriptet (eller mangler korrekte abostrof mm)

./test.sh
1 FW04.img
2 FW11.img
Choose a number?
1
chosen file
root@PFC200-423B57:~ awk -F" * )*" '{if ($1==1) print $2}' ./t.txt
FW11.img
root@PFC200-423B57:~

Hvor selve scriptet ser således ud:

MNT="/mnt/firmware/FW*/*.img"
SUM='1'
for entry in `ls $MNT`; do
        TEST=`echo $entry | rev | cut -d'/' -f 1 | rev `
        echo "$SUM $TEST" >> t.txt
        let $((SUM++))
done
cat t.txt
echo -e "Choose a number?"
read ANS
case $ANS in
        $ANS)
        FILE=`awk -F" * )*" '{if ($1==$ANS) print $2}' ./t.txt`
        echo -e "chosen file $FILE"
        ;;
        *)
        echo -e "exit the script"
        ;;
esac

osjensen
osjensen's picture
Antal: 1325
Tilmeldt:
14-01-2007
User is offline
#0Ved ikke om det hjælper

#0
Ved ikke om det hjælper dig - men
Din kode i #0, kører fejlfrit her hvis jeg bruger den rigtige fortolker.

#!/bin/bash
echo -e "Listing all Image files in NFS share: "
unset options i
while IFS= read -r -d $'\0' f; do....osv...

Bruger jeg

#!/bin/sh
echo -e "Listing all Image files in NFS share: "
unset options i
while IFS= read -r -d $'\0' f; do..........

får jeg også fejl.

Jeg kan læse at
select ikke er en eksekver bar bin, men et system kald.


peque
Antal: 918
Tilmeldt:
20-04-2005
User is offline
Fandt en løsning - Udfra

Fandt en løsning - Udfra Busybox på disse PLC ikke er inklusiv select system kald - Derfor blev det lidt anderledes !

for i in ${ARRAY[@]}; do
        IMG=`echo $i | rev | cut -d'/' -f 1 | rev `
        echo -e " $SUM) $IMG"
        let "SUM++"
done
echo -e "\e[39m"
## Asking for index number of images. Using answer as input ##
read -n 1 -p "Type the number for image file) ? `echo $'\n> '`" ANSWER
NR="$ANSWER-1"
echo -e " "
case $ANSWER in
        ## Using Number as Case switch
        "$ANSWER" )
                IMAGE=`echo ${ARRAY[$NR]}`
                IM=`echo $IMAGE | rev | cut -d'/' -f 1 | rev `
                FILE=${IM%.img}
                echo -e "  Chosen image file: \e[92m $FILE \e[39m"
                echo "Please verify the filename - Type YES"
                read ANS3
                echo " "
                if [ "$ANS3" != "YES" ];
                then
                        echo "Your answer is not correct - please try again"
                        echo "Type YES as answer. Exiting."
                        umount $MNT
                        exit 0
                fi
        ;;
        ## Not a Valid Input - Restarting script after umount. ##
        "*" )
                echo -e "\e[31m"
                echo -e "Not valid input for a Image file."
                echo -e "Restarting the script in 5 seconds."
                umount $MNT
                sleep 5
                exec /sbin/updateplc.sh
        ;;
esac