• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af peque | 17.10.2018 07:22

Liste filer i case switch - Map filnavn til nummer

Hjælp generelt
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

  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer5

# 1

6 år 8 måneder siden

Permalink

Indsendt af quap den 17. oktober 2018 kl. 11:29

Permalink

Hej peque,Ingen syntaxfejl

Hej peque,

Ingen syntaxfejl på min maskine, sikker på at din MNT variabel er defineret?
  • Log ind eller opret dig for at tilføje kommentarer

# 2

6 år 8 måneder siden

Permalink

Indsendt af peque den 17. oktober 2018 kl. 11:46

In reply to Hej peque,Ingen syntaxfejl by quap

Permalink

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




  • Log ind eller opret dig for at tilføje kommentarer

# 3

6 år 8 måneder siden

Permalink

Indsendt af peque den 17. oktober 2018 kl. 11:37

Permalink

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


  • Log ind eller opret dig for at tilføje kommentarer

# 4

6 år 8 måneder siden

Permalink

Indsendt af osjensen den 19. oktober 2018 kl. 00:06

Permalink

#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.
  • Log ind eller opret dig for at tilføje kommentarer

# 5

6 år 8 måneder siden

Permalink

Indsendt af peque den 19. oktober 2018 kl. 05:07

In reply to #0Ved ikke om det hjælper by osjensen

Permalink

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


  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0
Linux fra begynder til professionel af O'Reilly 0

Seneste aktivitet

En snak om Linux-kompatibel software 7
Nulstilling af adgangskode 6
Virtuel maskine? 2
PCLinuxOS 27
Gode anmeldelser Zorin OS 17.3 3
Open Source-eksperimentet 3
"Intet realistisk alternativ" - mig i r*ven 15
Ingen Mint 5
Linux App Store Flathub når 3 milliarder downloads 2
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 3
Mest sikker webbrowser 5
Firefox 2
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1
Læsning af databasefil i Firefox 2
Vanilla OS 15
Pepsi Challenge 4
Linuxin er nu migreret til Drupal 11 13

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !