View Single Post
Queen of Blades
Jonta's Avatar
Trådstarter DonorCrew
Sitat av kastrertHankatt Vis innlegg
Bra skrevet! Selvom jeg kan det så endte jeg med å lese alt.
Vis hele sitatet...
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

Kode

$ man read
«Hva faen. Det bare kom opp en generisk side om mange mange kommandoer jo!»

Det skjer på noen systemer. Prøv

Kode

$ help read
«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

/msg greybot echo

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]