Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 5472
Queen of Blades
Jonta's Avatar
DonorCrew
For newbies: Intro til shell, (de)konstruksjon av et skript jeg bruker ~hver dag
For erfarne: Gi kritikk til koden min 'a. (Ligger i første svar. Denne posten ble for lang)

shell er et programmeringsspråk som… altså, det er en måte å fortelle datamaskiner at…

Okay. Åpne terminalen. Sjekk din Linux-distro for hvordan
BSD: Du vet allerede hvordan
macOS: Terminal.app
Windows: Installér nyeste Ubuntu LTS fra Microsoft Store, og start derifra. (snegler forklarer mer lengre ned her

Shock horror: Det finnes flere måter å gjøre det på i macOS og Windows. Hvem skulle trodd.

OK.

Terminalen er åpen.

«Ser skummel ut»

Det går bra. Vi skal ikke gjøre farlige ting. Om du er usikker: Søk opp kommandoen før du taster den inn, så du er sikker på at jeg ikke lurer deg til å slette alle filene dine

Kode

ls
Lister opp filene i den mappa

Kode

ls -alhS
Lister opp skjulte filer også (a), i langt format (l), med størrelsene i menneskeleselig format (h), og sorterer dem etter størrelse (S)

«Cool. Ser litt hacker ut. Så dette er shell?»

Om du vil ha en fisefin definisjon av hva shell er, får du finne en selv

«Andre kommandoer?»

Plenty

Kode

mkdir lærelittshell
Oppretter en mappe som heter… gjett 2 ganger

Kode

cd lærelittshell
Går inn i den mappa

«Men… men ls. Jeg vil vite mer!»

Kode

man ls
For manualen. q for å gå ut igjen.

Eller foreta et nettsøk. Man-pages er ikke så nybegynnervennlige

Kode

touch filami
Oppretter ei fil ved navn…

Kode

file filami
empty ja. Det skal vi gjøre noe med

Kode

vim filami
OIOIOI skummelt! Jeg anbefaler å lære basics i vim. Tar ikke så lang tid som folk gir uttrykk for. Her er en tråd, https://freak.no/forum/showthread.php?t=303799

Kode

vimtutor
gir deg det du trenger

Kode

nano filami
Om du er under 10 år gammel. Shots fired. Du kommer til å bruke tid på å skrive, så det er verdt investeringa. Åpne, lagre, lukke, gå opp/ned/høyre/venstre. Bare fordi vim kan mye mer, betyr det ikke at du trenger å lære alt sammen før du kan bruke det

Uansett hvordan du gjør det, skriv følgende i fila: (vim: Tast i)

Kode

#!/bin/sh
ls -alhS
Og så lagrer og lukker du (vim: Escape-tasten, og så :x Enter (kolon, bokstaven x, begge bør dukke opp nederst på skjermen, trykk Enter)

«Hey, jeg kjenner igjen kommandoen!»

Jepp

Kode

chmod 755 filami
For å gjøre den kjørbar

Kode

./filami
Du kjørte nettopp et shell-skript!

Jepp. Så enkelt er det. Og PC-en din brant ikke opp, og FBI står ikke på døra, og ingen forteller de åpenbare teite vitsene

«Meeere! Meeere!»

OK. Åpne fila igjen

Kode

vim filami
Endre fila ved å legge til ei linje, så den nå ser slik ut:

Kode

#!/bin/sh
ls -alhS
echo "Kake er nammenam"
(Jeg er overbevist om at de fleste vil ha betydelig mer utbytte av å faktisk trykke taztene enn å bare copypaste. At det øker vissheten om at nettopp du også kan gjøre dette)

Lagre, lukk, og kjør, som før

Spytta maskina ut det du trodde den kom til å gjøre? Ei liste over filer, og så ei ny linje med «Kake er nammenam»?

Vi kan altså kjøre flere kommandoer etter hverandre, ved å plassere dem etter hverandre

«Jeg har mer å si om kake enn at det er nammenam altså»

Null problem

Kode

#!/bin/sh
ls -alhS
echo "Kake er nammenam"
echo "Kake er godt"
echo "Kake er topp"
Vi gjentar ordet «Kake» en del her. Faktisk gjentar vi «Kake er ». Vi skriver det 3 ganger. For et ork.

«Det var ikke så mye ork altså. Jeg bare kopierte den første linja, og så…» Neeei. Ork. Og så trenger jeg det til neste eksempel

Kode

#!/bin/sh
ls -alhS
variabelen_min="Kake er"
echo "$variabelen_min nammenam"
echo "$variabelen_min godt"
echo "$variabelen_min topp"
Ikke plassbesparende akkurat.

Kode

#!/bin/sh
ls -alhS
variabelen_min="Kake er, som min bestefar sa før i tiden, da blomstene var gule og ekorn brune og hele verden var dekket av hvite flekker på kartet, "
echo "$variabelen_min nammenam"
echo "$variabelen_min godt"
echo "$variabelen_min topp"
På tide å skrive noe selv altså. I stedet for å bare gjøre som jeg sier. Nå skal du få skrive inn noe, som maskina spytter ut:

Kode

#!/bin/sh
ls -alhS
echo "Hva skal variabelen inneholde?"
read variabelen_min
echo "$variabelen_min nammenam"
echo "$variabelen_min godt"
echo "$variabelen_min topp"
«OK JEG SKJØNNER NÅ JONTA HVOR ER EKSEMPELET FRA VIRKELIGHETEN JEG KJEEEDER MEEEG!»

I vim/(spac)emacs-tråden jeg lenker til over nevnes org-mode.
Jeg bruker det til en tabell for prosjektene mine.
Jeg har mange prosjekter.
236 i tabellen akkurat nå.
Det er mange å holde styr på.
Derfor har jeg en tabell.
«Har du vurdert å bare ikke ha tabellen?»
Ja. Det har jeg. Det funker ikke for hjernen min.
«Men JEG trenger ikke en slik tabell!»
Fint for deg. Finn et annet eksempel fra virkeligheten da.

Her er et minimalt eksempel på tabellen:

Kode

| 1 Total | 2 Name               | 3 Comment                            | 4 Tags                      | 5 Progress | 6 Utility | 7 Fun | 8 Desire | 9 Size | 10 Difficulty |
|---------+----------------------+--------------------------------------+-----------------------------+------------+-----------+-------+----------+--------+---------------|
|      17 | nFF lærer litt shell | Minimalt innhold. Bare få ut en tråd | nff, web, programming, tech |          3 |         6 |     7 |        8 |      4 |             3 |
#+TBLFM: $1=($5+$6+$7+$8-$9-$10)
Overskrifter
Skillelinje
Prosjektlinje
Helt nederst: Kalkulasjon: Jeg legger sammen progress, utility, fun og desire, og trekker fra size og difficulty. Er lik total. Som tabellen sorteres etter (org-table-sort-lines)

Ikke perfekt, men fy så mye flottere enn å ha ingenting.

Et problem dukket opp: Det var distraherende å se alle de andre prosjektene imens jeg tastet inn et nytt et

Løsning:

Et shell-skript som leser prosjektnavn fra ei fil, og så spør meg om kommentar, tags, osv etterhvert. Og så skriver det til en annen fil, så jeg kan copypaste innholdet fra den fila inni org-fila mi. (Kunne skrevet rett til org-fila, men såpass robust er ikke systemet mitt for dette enda. Og elisp, språket man bruker i emacs, er jeg ikke komfortabel med. Enda)

«Weird flex, but okay»

Ja? Hva trenger vi da?

«Eh… skrive?»

Ja. Hva mer?

«Lese fra fila. Og fila sjøl»

Jepp.

Input:

Kode

nFF lærer litt shell
Pluss det brukeren skriver inn

Output:

Kode

| 17 | nFF lærer litt shell | Minimalt innhold. Bare få ut en tråd | nff, web, programming, tech | 3 | 6 | 7 | 8 | 4 | 3 |
(org-mode tar seg av antall mellomrom)

«Org-mode, org-mode, org-mode. Skrev du denne posten i emacs også eller?»

Ja. bbcode-mode

«U r trash»

OK

«jk, ilu»

OK. Klar til å lage en liste over hva vi vil ha?

«Jaaa!»

- inputfil
- outputfil
- Lese brukerinput
- Lese fra inputfila
- Skrive til outputfila

Hva mer?

«Du sa det forstyrret å ha all teksten på skjermen. Kan vi fjerne den mellom hvert spørsmål kanskje?»

Det er som om du er en fiktiv forumbruker fundert opp av meg selv

Det kan vi bruke

Kode

clear
til. Prøv selv.

Kode

ls
Og så

Kode

clear
Ctrl+L går også. Men ikke i et skript. Så vidt jeg vet.

Såh:
- inputfil
- outputfil
- Lese brukerinput
- Lese fra inputfila
- Skrive til outputfila

Lese brukerinput har vi allerede gjort. Og lagret i variabel

Skrive til outputfil er også ganske greit:

Kode

#!/bin/sh
echo "Hva skal variabelen inneholde?"
read variabelen_min </dev/tty
echo $variabelen_min >> outputfila.txt
echo "$variabelen_min nammenam"
echo "$variabelen_min godt"
echo "$variabelen_min topp"
Dobbelpil er å legge til på bunnen av fila. Enkeltpil (>) betyr å overskrive den. Bruk med omhu

Og ja, jeg kvitta meg med ls-en

Da gjenstår bare:

- inputfil
- Lese fra inputfila

Og vi vil ikke bare lese én gang. Vi vil lese hver linje. Så lenge det er linjer

Kode

#!/bin/sh
echo "Hva skal variabelen inneholde?"
read variabelen_min
echo $variabelen_min >> outputfila.txt
echo "$variabelen_min nammenam"
echo "$variabelen_min godt" # Shhhhh. Her. Bak #-en, kan vi gjemme oss. Er en kommentar, skjønner du. Kan skrive hva jeg vil her. Shell-et ser oss ikke. Såeh… hvem er *du* forelska i?
echo "$variabelen_min topp"

while IFS= read -r inputfile_line; do
	echo $inputfile_line "er ei linje"
done < inputfil.txt
While, engelsk «imens». Noe sånt som «imens det fortsatt er linjer å lese, gjør det her:

Boom! Vi har ein inputfil, og vi leste fra den!

Ja, det er et par detaljer i den der while-linja som er litt rare. Hva er IFS= lizm. Og read -r

Men fikser du resten selv?

Skroll opp for de forskjellige feltene jeg vil ha ut. Husk at Total regnes ut i org-fila etterpå

Her er løsningsforslaget mitt. E lov å lurkik:

Antall kodelinjer:
SPOILER ALERT! Vis spoiler
32. Ish


Kode:
SPOILER ALERT! Vis spoiler

Kode

#!/bin/sh

while IFS= read -r inputfile_line; do
  echo Name?
  read name </dev/tty
  clear
  echo Comment?
  read comment </dev/tty
  clear
  echo Tags?
  read tags </dev/tty
  clear
  echo Progress?
  read progress </dev/tty
  clear
  echo Utility?
  read utility </dev/tty
  clear
  echo Fun?
  read fun </dev/tty
  clear
  echo Desire?
  read desire </dev/tty
  clear
  echo Size?
  read size </dev/tty
  clear
  echo Difficulty?
  read difficulty </dev/tty
  clear
  echo "| 0 | $name | $comment | $tags | $progress | $utility | $fun | $desire | $size | $difficulty |" >> outputfila.txt
done < inputfil.txt


shellcheck er et fint verktøy
#bash på Freenode ser ut til å kunne sakene sine (Kan være strenge. Vit hvordan man stiller spørsmål på internett)
https://mywiki.wooledge.org

Jeg har foretatt forbedringer såklart. Kanskje jeg går gjennom dem én og én senere i tråden

Om du vil prøve deg uten å se på koden jeg bruker nå er dette ei cirka komplett liste:
SPOILER ALERT! Vis spoiler

- Progressbar
- shellcheck for å forebedre ting (printf > echo)
- Kan ta et argument som inputfil
- outputfile har timestamps i filnavnet
- Hoppe over prosjekter
- Markere prosjekt som gjort
- En del av det i en funksjon
- Ha det-hilsen
Sist endret av Jonta; 23. september 2019 kl. 20:13. Grunn: Lenker til snegler sin post for Windows-brukere
Queen of Blades
Jonta's Avatar
Trådstarter DonorCrew
Til slutt for denne gang: Nåværende kode. Med kommentarer og ting jeg har lyst til å gjøre, og hvertfall én bug:
SPOILER ALERT! Vis spoiler

Kode

#!/bin/sh
# Input file with one project name per line.
# Output: Orgfile to be pasted into Spacemacs org-table, to prioritise projects
# Makes for a less visually distracting environment to think about these projects

# rhellcheck disable=SC2162 # read without -r will mangle backslashes - Here as example of shellcheck-ignore

# TODOs:
# Insert marker in inputfile when interrupting the script before going through the whole inputfile. Would this marker have to be ignored by the script too?
# Autocomplete words on tag-page
# Remove outputfile if it's empty - They're often created during testing, and are tedious to remove by hand, but I'd rather do that than lose data

# MAYBE:
# Keep character limit in mind(?) Not that important. Better be expressive than caring that much about the length. Display number of characters while typing?
# If answer to a different one is "skip", skip just that column
# Options? Well. What options would I want?
# Sorts tags alphabetically?
# Calculates scores? (Would be a double thing though. Here and in Spacemacs. If in this script too: Sort by score)

# WON'T:
# Separate output into functions. From http://mywiki.wooledge.org/BashWeaknesses on 29aug2019: "There's no way to tell a function the name of a variable where you want it to put its output" - So yes: *Can* be done, but probably, sadly, shouldn't.
# Highlights tags I've already written - #bash says ~impossible

clear

inputfile=$1
if [ "${inputfile}" = "" ]; then
	inputfile=samplefile.txt
fi
current_line_num=1

# New file every time to avoid data loss. 29Aug2019_HH:MM:SS
timestamp_now=$(date +"%d%b%Y_%T")
outputfile="projectratings-${timestamp_now}.org"
touch "${outputfile}"

total_column=0
projects_already_done=0

# IFS= allows for spaces in the line
while IFS= read -r inputfile_line; do
	projectname=${inputfile_line}

	# Before progbar
	num_of_input_lines=$(wc -l < "${inputfile}")

	progfraction=$(printf '%s' "${current_line_num}/${num_of_input_lines}:" | tr -d ' ') # 6 extra spaces without the tr

	rating_progress=$(echo "scale=3; ${current_line_num} / ${num_of_input_lines} * 100" | bc) && rating_progress=${rating_progress%.*} # Removes decimals

	if [ "${projects_already_done}" -gt 0 ]; then
		done_print=" - ${projects_already_done} done"
	fi

	print_before_progbar="${progfraction} ${rating_progress}%${done_print} " # Done here because num of chars determines progbar length
	
	# Progbar
	columns_in_terminal=$(tput cols) && progbar_blocks=$((columns_in_terminal - ${#print_before_progbar} - 2)) # The 2 []-brackets
	progbar_completes_num=$((rating_progress * progbar_blocks/100)) && progbar_remains_num=$((progbar_blocks - progbar_completes_num))
	i=0; while [ "${i}" -lt "${progbar_completes_num}" ]; do progbar_completes="${progbar_completes}#"; i=$((i + 1)); done  # 1st symbol
	i=0; while [ "${i}" -lt "${progbar_remains_num}"   ]; do   progbar_remains="${progbar_remains}.";   i=$((i + 1)); done  # 2nd symbol
	progbar="[${progbar_completes}${progbar_remains}]" && progbar_completes="" && progbar_remains=""

	# Header
	header="${print_before_progbar}${progbar}"

	# Project name
	printf '%s\n' "${header}" "" "" "" "" "${inputfile_line}" # "1/10: 10%". Bumping down project name to make the transition to the next project more noticable

	# Enter project name, or hit enter to keep current name
	printf '%s' "1/9 Name? " && read -r new_name </dev/tty

	clear && printf '%s\n' "${header}" "" ""
	if [ "${new_name}" != "" ]; then
		projectname=${new_name}
	fi

	# Done and skip
	if [ "${new_name}" = "done" ]; then
		projects_already_done=$((projects_already_done + 1))
	elif [ "${new_name}" = "skip" ]; then
		printf '%s\n' "${inputfile_line}" >> "${inputfile}"
	else
		# Description - Prints original input in case part of description is there
		printf '%s\n' "(${inputfile_line})"
		printf '%s\n' "${projectname}" && printf '%s' "2/9 Description? " && read -r description </dev/tty

		# Tags - tag-script is not clear-ed, and shows what tags are already in use in the org-file
		clear && printf '%s\n' "${header}" "" && tag && printf '%s\n' "---" "${projectname}" "${description}" && printf '%s' "3/9 Tags? " && read -r tags </dev/tty

		# Int columns
		int_column () {
			clear && printf '%s\n' "${header}" "" "${projectname}" && printf '%s' "$1" && read -r "$2" </dev/tty && printf '\n'
		}
		progress="" && utility="" && fun="" && desire="" && size="" && difficulty="" # Fixes "References but not assigned" SC2154
		int_column "4/9 Progress? "   progress
		int_column "5/9 Utility? "    utility
		int_column "6/9 Fun? "        fun
		int_column "7/9 Desire? "     desire
		int_column "8/9 Size? "       size
		int_column "9/9 Difficulty? " difficulty
	
		printf '%s\n' "| ${total_column} | ${projectname} | ${description} | ${tags} | ${progress} | ${utility} | ${fun} | ${desire} | ${size} | ${difficulty} |" >> "${outputfile}"
	fi

	clear && current_line_num=$((current_line_num + 1))

done < "${inputfile}"

# Goodbyes
tput setaf 2 # Green
printf '%s\n' "All your base"
tput sgr0
sleep 0.3
clear

if [ "${header}" != "" ]; then  # Empty inputfile? Don't print what would be an empty header
	printf '%s\n' "${header}" # Showing user what they've just accomplished
fi


«Fy faen du oppfatter oss visst som barnslige as» - Tenk det da. Jeg skriver noe til en stor mengde folk, som jeg stort sett ikke har møtt, og det treffer ikke akkurat deg helt perfekt.
Bra skrevet! Selvom jeg kan det så endte jeg med å lese alt.
Eit tips til Windowsbrukarar:

Som Jonta referer til, kan ein no installere ein Linux-terminal under Windows, men funksjonene må vere aktivert. Sjå her for guide til dette Det finst andre distroar enn Ubuntu å velge mellom, t.d. Kali, som kan vere fint om du held på med nettverk- og tryggleiksgreier.

Personleg synst eg terminal-teksteditorane er litt kronglete å halde på med, så eg skriv gjerne scripta mine i kodeeditoren eg er mest vant med, som i mitt tilfelle er Sublime. Dette er uproblematisk, heilt til ein skal lagre og køyre scripta.

For det første kan det vere litt knotete å finne att scriptet. Difor er det kjekt å vite at heile Windows-filsystemet er mounta under /mnt/c, og du kan til-og-med skrive script som roter rundt med dette. På same måten er det kjekt å vite at ein kan få tilgang til home-mappa gjennom windows med å gå til %LocalAppData%\Packages\DinDistro\LocalState\rootfs\home\Din Brukar\ Eg ville ikkje pølsa for mykje med det som ligg under rootfs gjennom Windows, då det er fort gjort å kødde noko til.

Om du no har funne scriptet ditt, eller lagra det ein stad i Linux-filsystemet, skulle det berre vere å køyre de slik Jonta forklarer, men nei, det går ikkje. Dette er fordi filer lagra med eit Windows-program har feil linjeendingar i høve til korleis det skal vere i Linux. For å bøte på dette må ein først køyre t.d. dos2unix på fila, som fiksar dette. Gjer det, og tada, du kan no skrive script i Windows-editoren din og køyre dei i Windows subsystem for Linux...

Om du ønsker å lære deg Linux kommandolinja, inkl bash-scripting, kan eg på det varmaste anbefale boka The Linux Command Line av William Shots, som ligg gratis på linken...
▼ ... over en uke senere ... ▼
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]
Trigonoceps occipita
vidarlo's Avatar
Donor
Fann den teksten din veldig uoversiktleg, ettersom det stortsett var korte setninger som forklare lite, og ekstremt mykje luft, som gjorde at det var vanskeleg å få tak på den.

Forøvrig: for å hindre at grep (og mange andre verkty) tolker ting som parametre kan du bruke --, altså foo | grep -- "-r". Det funker og om du vil slette ei mappe som heiter f.eks. "-Rf"...
Trigonoceps occipita
vidarlo's Avatar
Donor
Forøvrig verdt å minne om https://www.humblebundle.com/books/l...-oreilly-books

Det er et par bøker der som bør vere høgaktuelle om du vil lære shell:
-Bash cook book
-Classic Shell Scripting
-Awk
-Sed
-Regexp
etc.