[sf-lug] shell quoting (was: sudo)

Michael Paoli Michael.Paoli at cal.berkeley.edu
Wed Nov 8 19:24:51 PST 2017

Various ways, but, e.g.:
shell variable / named parameter is set in the outer/surrounding
shell, then, minimally, something like this (but possibly a bit

sudo sh -c 'echo "'\''$ap_ip'\''  library library.lan rachel  
rachel.lan" >> /etc/hosts'
But that could be potentially rather hazardous, depending upon what
ap_ip is set to.
Safer would be something more like:
sudo sh -c 'echo "'\''"$ap_ip"'\''  library library.lan rachel  
rachel.lan" >> /etc/hosts'

Complete explanations left as an exercise.  :-)
' - shields from shell (quotes) everything, until matching '
" - quotes, but subject to variable/parameter/command substitution (and
     perhaps a wee bit more, depending upon what shell)
\ - when not itself otherwise quoted, quotes just the immediately following
'\'' within a pair of '' ends up as a literal ' - take that one character
      at a time parsing it through slowly to understand, e.g.:
      ''\''' - take it character by character to see what happens.
with variable/parameter substitution, if not otherwise quoted, "words"
are split at whitespace - sometimes that's exactly what one wants/needs,
most (but not all) of the time that's not something one wants.
And remember, "$@" is your friend (usually what one wants, among
$*, $@, and "$@", and for completeness, "$*").

Remember to take things layer-by-layer, figuring out what things "look"
like to the shell, and what it does with them, each time shell parses
such.  Use of +x and/or -v can also be useful/informative.

> From: "Alex Kleider" <akleider at sonic.net>
> Subject: [sf-lug] sudo
> Date: Wed, 08 Nov 2017 18:30:28 -0800

> I am working with a headless Raspberry Pi and would like to be able
> to add a line to a file owned by root but would like to do this from
> within a bash script that itself is not run with root privileges.[1]
> Here is what I have come up with so far:
> #!/bin/bash
> # File: t.sh
> export ap_ip=
> sudo sh -c 'echo "$ap_ip  library library.lan rachel rachel.lan" >>  
> /etc/hosts'
> This seems to work except for the fact that the variable ap_ip
> does not get inserted, only the other part of the line.
> I think it's because the quoting has not allowed the variable to
> be passed.
> Can anyone advise how this should be done?
> Thanks in advance.
> [1] It so happens that the Raspberry Pi does not ask for a password
> when an sudo command is issued (not sure how that is- not seen it
> on any other Linux system.)
> -- 
> Alex Kleider
> (sent from my current gizmo)

More information about the sf-lug mailing list