Liste filer i case switch - Map filnavn til nummer

peque
Antal: 936
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: 936
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: 936
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: 1379
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.

Windows, giver dig det du betaler for.
Linux, giver dig det du vælger.


peque
Antal: 936
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