chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

creating scripts to automate setup of new images

Mon May 15, 2017 3:25 am

Hi I've been playing around with a few images trying to work out which one is right for me. One issue that this has created is having to manually make changes to files each time.

So I want to create a script that will make these changes for me.

for example, Im using HIfiBerry DAC which requires that I open /boot/config.txt (needs sudo)
find and edit the line dtparam=audio=on (id rather just comment it out)
replace it with dtoverlay=hifiberry-dacplus

Then I need to create the file /etc/asound.conf with the contents:
pcm.!default {
type hw card 0
}
ctl.!default {
type hw card 0
}

How could I create a shell script for this that will work on the raspberry pi?

mfa298
Posts: 1387
Joined: Tue Apr 22, 2014 11:18 am

Re: creating scripts to automate setup of new images

Mon May 15, 2017 10:28 am

sed is your friend for things like this. as an example (from memory)

Code: Select all

sudo sed -i -e '/^dtparam=audio/ s/^/# /' /boot/config.txt
this does an in place edit of the file (-i)
searches for a line starting dtparam=audio (/^dtparam=audio/)
and then does a search and replace (s) on that line replacing the start of the line (^) with a comment (# )

you could expand that with (again from memory)

Code: Select all

sudo sed -i -e '/^dtparam=audio/ {s/^/# /; a dtparam=hifiberry-dacplus}' /boot/config.txt
which should comment out the old line (as before) and then append (a) the new line after.

this form is probably also safe in that if you ran it a second time it wont make any changes.

for testing remove the sudo (means you cant write a new file) and the -i and it'll print out the new version on the console.

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 6:21 am

awesome! thanks heaps for your help. this is great. ill start experimenting with this tonight!

I read about sed (dont really know what it is) but I wasn't sure that would work with the pi. I read somewhere that shell scripts werent meant to edit files or something like that.

is sed another language? because i saw some similar code that used perl

how do i create the new file /etc/asound.conf with

Code: Select all

pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}

jahboater
Posts: 5825
Joined: Wed Feb 04, 2015 6:38 pm
Location: West Dorset

Re: creating scripts to automate setup of new images

Wed May 17, 2017 8:41 am

chito wrote: I read about sed (dont really know what it is) but I wasn't sure that would work with the pi. I read somewhere that shell scripts werent meant to edit files or something like that.
"sed" is short for stream editor. Its quite hard to learn (as usual see "man sed"). Of course you can edit files in shell scripts by various means, but take care (and save a backup of the original file first).
chito wrote:how do i create the new file /etc/asound.conf with

Code: Select all

pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}
You don't need sed to create a new file.
One was is to simply copy in a pre-prepared file.
Another way is within the shell script itself using a feature oddly called a "here document"

Code: Select all

cat <<EOF >/etc/asound.conf
pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}
EOF
This must be run as root, so try this instead for the first line:-

Code: Select all

cat <<EOF | sudo tee /etc/asound.conf >/dev/null

mfa298
Posts: 1387
Joined: Tue Apr 22, 2014 11:18 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 9:21 am

jahboater wrote:This must be run as root, so try this instead for the first line:-

Code: Select all

cat <<EOF | sudo tee /etc/asound.conf >/dev/null
You should be able to shorten that slightly to

Code: Select all

sudo tee /etc/asound.conf << EOF >/dev/null

jahboater
Posts: 5825
Joined: Wed Feb 04, 2015 6:38 pm
Location: West Dorset

Re: creating scripts to automate setup of new images

Wed May 17, 2017 10:32 am

mfa298 wrote:You should be able to shorten that slightly to

Code: Select all

sudo tee /etc/asound.conf << EOF >/dev/null
Yes much better!
You can practice all this sort of thing on the command line of course, just to try it out.

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 10:42 am

thanks heaps!!!
this is exactly what i needed. with this i think i can make the other changes i need. its certainly heaps to go on.

really appreciate the help

mfa298
Posts: 1387
Joined: Tue Apr 22, 2014 11:18 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 3:18 pm

chito wrote: this is exactly what i needed. with this i think i can make the other changes i need. its certainly heaps to go on.
The other powerful tool that can be useful is awk, for instance you could list the set of configured dtparams and their settings with something like:

Code: Select all

pi@pi2:~ $ awk -F= '/^dtparam/ {print $2, $3}' /boot/config.txt
spi on
audio on
That example sets the = as the field separator (-F), then searches for lines starting dtparam (/^dtparam/) and shows the 2nd and 3rd fields (print $2, $3), you could also print the whole line with $0.

Other generic tools you might find useful in a script are: tr, cut, head, tail, grep, sort, uniq

jbudd
Posts: 1446
Joined: Mon Dec 16, 2013 10:23 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 3:29 pm

You can see an example of a script to setup various options on a new Raspberry Pi or other single board computer at https://bitbucket.org/snippets/scargill ... the-script.

It's a big shell script that does assorted updates, installations and setup functions. Not directly relevant to your HiFiBerry setup but it may be useful as a model

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Wed May 17, 2017 10:47 pm

thanks heaps that looks really really useful.

i have a few things i need to do to setup an image and the Hifiberry setup was a good starting point as it needs find and replace settings and creat a new file. 2 of the things i need to do alot

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Thu May 18, 2017 1:51 am

so what happens when the code to create a new file tries to create it and there's already a file with that name?
will it replace it? if that makes things easier. if not the instructions from hifiberry are to delete it and create a new one

Code: Select all

sudo tee /etc/asound.conf << EOF >/dev/null
pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}
EOF

mfa298
Posts: 1387
Joined: Tue Apr 22, 2014 11:18 am

Re: creating scripts to automate setup of new images

Thu May 18, 2017 1:56 am

chito wrote:so what happens when the code to create a new file tries to create it and there's already a file with that name?
will it replace it? if that makes things easier. if not the instructions from hifiberry are to delete it and create a new one

Code: Select all

sudo tee /etc/asound.conf << EOF >/dev/null
pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}
EOF
"man tee" would give you the answers for that one.
by default tee will overwrite the file, you could also supply the -a argument to it making it append to the file.

jahboater
Posts: 5825
Joined: Wed Feb 04, 2015 6:38 pm
Location: West Dorset

Re: creating scripts to automate setup of new images

Thu May 18, 2017 6:39 am

See also "man install" and "man test"

Use test like this (its also called "[" !!):-

Code: Select all

if [ -e /etc/asound.conf ] ; then
  echo "File exists" 
fi

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 12:59 pm

Ok so i tried it for the first time. created the a script called mysetup.sh

Code: Select all

sudo sed -i -e '/^dtparam=audio/ {s/^/# /; a dtparam=hifiberry-dacplus}' /boot/config.txt

cat <<EOF >/etc/asound.conf
pcm.!default {
  type hw card 0
}
ctl.!default {
  type hw card 0
}
EOF
I made it executable with

Code: Select all

sudo chmod 0744 /home/pi/mysetup.sh
ran the code with from within /home/pi

Code: Select all

sudo ./mysetup.sh
And i got the following errors

Code: Select all

sed: -e expression #1, char 0: unmatched `{'
: not founder.sh: 2: ./mysetup.sh:

jbudd
Posts: 1446
Joined: Mon Dec 16, 2013 10:23 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 1:20 pm

You could do it as two seperate sed commands:

Code: Select all

sed -i -e '/^dtparam=audio/ s/^/#/' -e '/^#dtparam=audio/a dtparam=hifiberry-dacplus '

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 1:37 pm

I get the following error now

Code: Select all

sed: no input files
: not founder.sh: 3: ./mysetup.sh:
Last edited by chito on Fri May 19, 2017 1:49 pm, edited 1 time in total.

jbudd
Posts: 1446
Joined: Mon Dec 16, 2013 10:23 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 1:42 pm

Did you just copy and paste my suggestion? Because that does not, as the error message hints, specify any input files. (I didn't want to edit my /boot/config.txt so I tried it on some other file)

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 1:59 pm

Yep sorry my oversight, so i added the file

Code: Select all

sudo sed -i -e '/^dtparam=audio/ s/^/#/' -e '/^#dtparam=audio/a dtparam=hifiberry-dacplus' /boot/config.txt
and the error is weird

Code: Select all

: No such file or directoryg.txt
: not founder.sh: 3: ./mysetup.sh:
no such directoryg.txt... whats directoryg.txt? something is going on with the filename

jbudd
Posts: 1446
Joined: Mon Dec 16, 2013 10:23 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 2:03 pm

Does the string "g.txt" exist anywhere in your script file? Possibly some control character has snuck in and the shell is misinterpreting it.

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 2:08 pm

this is the entire content of my script

Code: Select all

sudo sed -i -e '/^dtparam=audio/ s/^/#/' -e '/^#dtparam=audio/a dtparam=hifiberry-dacplus' /boot/config.txt

cat <<EOF >/etc/asound.conf
pcm.!default{
	type hw card 0
}
ctl.!default {
	type hw card 0
}
EOF

jbudd
Posts: 1446
Joined: Mon Dec 16, 2013 10:23 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 2:17 pm

In your script file, retype the first line, not copy and paste. Don't split it into multiple lines. Then delete the original line and see if it works.

If you can't find a bug in a shell script it can help to try and do less with each line of code. For example instead of two -e parameters, run sed twice, each time making only one edit. At least you should find out which bit is upsetting it.

chito
Posts: 11
Joined: Thu May 11, 2017 5:14 am

Re: creating scripts to automate setup of new images

Fri May 19, 2017 2:39 pm

i can tell this is going to be one of those annoying problems that is going to be a pain to sort out

retyped the line, didnt work
the tried the following two lines and they both didnt work

Code: Select all

sudo sed -i -e '/^dtparam=audio/ s/^/#/' /boot/config.txt

Code: Select all

sudo sed -i -e '/^#dtparam=audio/a dtparam=hifiberry-dacplus' /boot/config.txt
they all give the same error

Code: Select all

No such file or directoryg.txt
so then i created a test.txt in /home/pi. updated the line to

Code: Select all

sudo sed -i -e '/^dtparam=audio/ s/^/#/' -e '/^#dtparam=audio/a dtparam=hifiberry-dacplus' /home/pi/test.txt
and i get

Code: Select all

No such file or directoryst.txt

Return to “Beginners”