This is an open series in which Hacker Public Radio Listeners can share their Bash scripting knowledge and experience with the community. General programming topics and Bash commands are explored along with some tutorials for the complete novice.
Useful Bash functions - part 2
Overview
This is the second show about Bash functions. In this one I revisit the yes_no function from the last episode and deal with some of the deficiencies of that version.
As before it would be interesting to receive feedback on these versions of the function and would be great if other Bash users contributed ideas of their own.
Full Notes
Since the notes explaining this subject are long, they have been placed here.
Comment #1 posted on 2016-08-18T19:38:12Z by Ken Fallon
Here's me with the questions
Any special significance to the "%s" ?
Did not know this: ${FUNCNAME[0]}:
nor this: ${BASH_LINENO[0]}:
nor this: default="${2^^}"
Why do this:
printf -v prompt "$prompt" "[Y/n]"
and not this:
prompt="${prompt} [Y/n]"
Comment #2 posted on 2016-08-18T20:59:27Z by Dave Morriss
Some answers for you...
The "%s" is to be used in the prompt, as in:
if ! yes_no_mk3 'Do you want to continue? %s ' 'N'; then
It indicates the point at which the possible responses are shown in the prompt, using capitalisation to denote which is the default. I used '%s' because I'll be using the prompt string as a format definition for printf, and '%s' means "substitute a string of arbitrary length here".
The use of printf to write the prompt string allows the format to be defined when calling the function. The way it's laid out is:
printf -v prompt "$prompt" "[Y/n]"
because the '-v prompt' saves the result in variable 'prompt' (rewrites it).
The "$prompt" is the format string like when you do:
printf "The answer is %d\n" 42
giving:
The answer is 42
In this case however, the text to be substituted for '%s' is "[Y/n]".
None of this would work with:
prompt="${prompt} [Y/n]"
In my example function call above you'd get 'prompt' containing:
"Do you want to continue? %s [Y/n]"
No substitution would happen.
Of course you could redesign the function to simply append the "[Y/n]" to the prompt in the way you did. I just liked the flexibility of being able to place that part of the prompt where I liked.
Note to Verbose Commenters
If you can't fit everything you want to say in the comment below then you really should record a response show instead.
Note to Spammers
All comments are moderated. All links are checked by humans. We strip out all html. Feel free to record a show about yourself, or your industry, or any other topic we may find interesting. We also check shows for spam :).