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
09-11-2004
Hej peque,
Ingen syntaxfejl på min maskine, sikker på at din MNT variabel er defineret?
Venlig Hilsen
qUAp
20-04-2005
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
20-04-2005
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
14-01-2007
#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.
--------------------------------------------------------
Søg på linuxin:
https://duckduckgo.com/?q=+site%3Alinuxin.dk+%3F&i...
20-04-2005
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