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:
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:
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
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
Kommentarer5
Hej peque,Ingen syntaxfejl
Ingen syntaxfejl på min maskine, sikker på at din MNT variabel er defineret?
Har fundet ud af mit problem
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
Nå har kæmpet lidt med
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
#0Ved ikke om det hjælper
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.
Fandt en løsning - Udfra
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