Sitat av
kastrertHankatt
Bra skrevet! Selvom jeg kan det så endte jeg med å lese alt.
Takktakk
Nå gjelder det «bare» å få newbies til å prøve seg
Om du kan det tar du kanskje utfordringa med å forbedre koden min? =)
_______________________
Så nå har vi et skript som gjør det vi vil.
Bortsett fra ekstragreiene jeg nevnte at jeg la til på slutten
«Ja hva nå?»
Jeg foretrekker å skrive ting som kan bruker på mange plasser. Så de blir «portable». At de ikke funker på ett system, men ikke et annet.
Til det kan vi bruke POSIX-standarden. Den er åpen, IEEE sjefer over den, bladibladibla. Om det du skriver er POSIX, så funker det nok overalt (hei Windows).
Av og til blir det for mye last å følge POSIX, og da kan man ty til f.eks.
bashisms. Om du bruker fish bør du være obs på at de ikke prøver å være sh-kompatible. zsh og bash utvider sh. AFAIK. IANAL. TINLA.
«Lang tabell er laaang!»
Bra meme. Vi bruker shellcheck først:
Kode
$ shellcheck skriptalpha
«Åh herregud. Så mange feil!»
Mja. Samme feil en rekke ganger:
Kode
^--^ SC2162: read without -r will mangle backslashes.
«Read without -r… så… vi bare legger til " -r" bak read?»
Prøv da
«Stoler ikke på deg. Du dreper maskina mi»
Null problem. Sjekk man-page med
«Hva faen. Det bare kom opp en generisk side om mange mange kommandoer jo!»
Det skjer på noen systemer. Prøv
«Okay. Men fortsatt mye tekst»
Få den til å vise deg bare linjene med «-r» i seg:
Kode
help read | grep "\-r"
«Vent… hæ? Hva gjør den streken? Og hva er «grep»?»
Streken er en pipe. Et rør. Det som kommer som output fra det før, blir satt inn som input til det etter. Du kan ha mange slike på rad
grep finnes det en WP-artikkel for, og du vet hvordan man sjekker brukermanualen til den
Ellers er det ofte enklere å foreta et websøk etter kommandoen. Finner du noe med "shell read "-r""?
«Egne anførselstegn rundt -r?»
Ellers fungerer bindestreken som minustegn, og trekker fra søkeresultater som inneholder det
«Ugh. Javel. Ja. Jeg finner ting. Jeg bare prøver read -r jeg»
«Høh. Feilene forsvant»
Jepp
«Men "SC2034: inputfile_line appears unused. Verify use (or export if used externally)." er fortsatt der!»
Er det en link der også?
«Hmh. Jeg leste den. Jeg prøver å bare fjerne "inputfile_line" jeg»
Kjør på
«Tenk det da. Det virka. Jeg fjerna den unødvendige tingen. Hvorfor var den der i det hele tatt?»
Jeg bruker den litt senere. Så nå er koden slik?
SPOILER ALERT! Vis spoiler
Kode
#!/bin/sh
while IFS= read -r ; do
echo Name?
read -r name </dev/tty
clear
echo Comment?
read -r comment </dev/tty
clear
echo Tags?
read -r tags </dev/tty
clear
echo Progress?
read -r progress </dev/tty
clear
echo Utility?
read -r utility </dev/tty
clear
echo Fun?
read -r fun </dev/tty
clear
echo Desire?
read -r desire </dev/tty
clear
echo Size?
read -r size </dev/tty
clear
echo Difficulty?
read -r difficulty </dev/tty
clear
echo "| 0 | $name | $comment | $tags | $progress | $utility | $fun | $desire | $size | $difficulty |" >> outputfila.txt
done < inputfil.txt
«Jas»
Og shellcheck?
«Finner nada feil»
Hmmm
«Hm?»
Har du… tittet i brukermanualen til shellcheck?
«Nei…?»
Prøv
Kode
$ shellcheck -o all skriptalpha
«-.-»
?
«"all" ja. Nå fant den feil igjen»
Hehe, hvilke da?
«HvilkeN. Bare én. Men mange ganger»
Fiks den da =)
«Du as. Når skal vi legge til flere funksjoner?!»
Etter dette
«Pfff»
«"Braces"?»
{ og } - Eksperimentér litt
«Åja vent litt. shellcheck foreslår det jo over linken»
Tør du å copypaste det?
«Ser jeg klein ut eller?»
Jeg tar det som et ja
«Jeg turte. Det funka. Ny funksjon. Nå»
OK
«For den er perfekt nå, ikke sant? POSIX og sånn?»
Vel…
«Neimen i svarte da. Hva er igjen?»
Du husker den lange tabellen?
«Ja. Den var lang»
Trenger ikke lese hele. Bare søk etter det vi har brukt så langt
«Så. Mye. Styyyr»
I starten så. Du kommer deg over kneika
«Så lenge du holder meg i hånda så»
Jeg holder
«while ser uproblematisk ut. Bare ett treff. Samme med IFS. "use IFS" står det»
Ja
«"read -- the only option defined by POSIX is -r", som er den vi bruker»
«27 treff på "do"?!»
Legg til mellomrom da
«Før eller etter?»
Prøv begge
«Ser greit ut»
«Oi. echo. Den har jeg jo sett brukt en del. "Instead use printf "%s\n"»
Jepp
«Det var den du var ute etter?»
Jepp
«Og du fant den ved å gå gjennom denne tabellen?»
Nope
«…»
«Jeg… gi meg…»
#bash på Freenode er en fin bil
«…»
Greycat, som er Mr. Wooledge, er der
«…»
Han har også greybot
«…»
«…?»
Kode
echo outputs a string. echo has many portability problems, and should never be used with option flags. Consider printf instead: printf 'name: %s\n' "$name". http://wiki.bash-hackers.org/commands/builtin/echo | http://cfajohnson.com/shell/cus-faq.html#Q0b | http://www.in-ulm.de/~mascheck/various/echo+printf
«Så printf er bedre enn echo»
Jepp
«k»
Kjør på
SPOILER ALERT! Vis spoiler
Kode
#!/bin/sh
while IFS= read -r ; do
printf '%s\n' Name?
read -r name </dev/tty
clear
printf '%s\n' Comment?
read -r comment </dev/tty
clear
printf '%s\n' Tags?
read -r tags </dev/tty
clear
printf '%s\n' Progress?
read -r progress </dev/tty
clear
printf '%s\n' Utility?
read -r utility </dev/tty
clear
printf '%s\n' Fun?
read -r fun </dev/tty
clear
printf '%s\n' Desire?
read -r desire </dev/tty
clear
printf '%s\n' Size?
read -r size </dev/tty
clear
printf '%s\n' Difficulty?
read -r difficulty </dev/tty
clear
printf '%s\n' "| 0 | ${name} | ${comment} | ${tags} | ${progress} | ${utility} | ${fun} | ${desire} | ${size} | ${difficulty} |" >> outputfila.txt
done < inputfil.txt
«Hva… betyr '%s\n'?»
Det er hvordan det skal formateres. Det formatet tilsier «skriv strengen, og så en ny linje. Så om du kjører
Kode
printf '%s\n' "Heisann oppå" "Degsann"
Får du
Kode
Heisann oppå
Degsann
Prøv med '%s\n\n\n\n'. Eller bare '%s'
«Ny. Funksjon. Nå.»
Jepp
«Nååå»
Ja
«Ikke noe fiksfakseri. Nååå!»
Hva vil du ha da?
«Hvordan skal jeg vite hva jeg vil?»
Kjør programmet og finn ut hva som irriterer deg ved det
«Jeg må gjøre alt her»
Ja. Og jeg gjør resten.
«Vent. Det spør etter navn, men sier ikke hva som er i inputfila. Hvordan skal jeg vite hva som står på linja den er på?»
Tjaaa… hvordan?
«… jeg kan få skriptet til å skrive det ut»
Mhm. Når da?
«Før den spør etter navnet såklart»
Gogogo!
«Så en variabel. Som har linja som verdi»
Ja… det var det da…
«Vent. Den der "inputfile_line"-greia jeg fjerna»
Hmm?
«Ikke hmm på meg. Jeg putter den inn igjen og får det her:
Kode
#!/bin/sh
while IFS= read -r inputfile_line ; do
printf '%s\n' ${inputfile_line}
printf '%s\n' Name?
og så videre»
Funker det da?
«Jaaa… sikkert?»
Du testa ikke?
«Uuuggh, det er en sååå liten forandring!»
Ah okei bare signér her på at det garantert funker og at jeg får en bunke penger om det…
«Jaaaaaveeeeeeeel»
«…»
«Bæsj»
Hm? =)
«Jeg har 2 ord på første linje, og de blir separert med linjeskift»
Hmmmm
«Ahaaa! Er sikkert den der \n som ødelegger!»
Du får vel…
«Fjerne den. On it!»
«…»
«Pøkk»
Hm?
«Nå skriver den "FørstelinjeName?" før den spør om input på ny linje»
Kjørte du shellcheck?
«KjØrTe dU ShElLcHeCk?»
Kjør det nå da
Kode
Double quote to prevent globbing and word splitting.
Word splitting ja. Høres…
«Den foreslo
Kode
printf '%s' "${inputfile_line}"
og det prøvde jeg og da var det mellomrom mellom «Første» og «linje» men ikke «linje» og «Name» så da la jeg til \n igjen og nå funker det >:[»
Sur?
«Tar så lang tiiid! Så mange detaljer!»
Ja. I starten. Man må venne seg til finurlighetene ved et nytt språk. Eller kanskje finurlighetene ved programmering generelt
Fikk lagd en ny funksjon da =)
«Ja… til slutt…»
«Tar det alltid så lang tid?»
Ofte. Avhenger såklart av hvor erfaren man er og hvor stor funksjonen skal være. Og som du ser kan man ødelegge andre ting imens man bygger den, og det vil man jo unngå
[Enda mer tydelig beskjed om tenk på dette neste gang du syter om at et spill, nettforum eller app du bruker ikke har den og den funksjonen]