Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue understanding a parameter expansion in a bash script

I am trying to understand what a parameter expansion does inside a bash script.

third_party_bash_script

#!/bin/sh
files="${*:--}"
# For my understanding I tried to print the contents of files
echo $files 

pkill bb_stream
if [ "x$VERBOSE" != "" ]; then
        ARGS=-v1
fi
while [ 1 ]; do cat $files; done | bb_stream $ARGS

When I run ./third_party_bash_script, all it prints is a hyphen - and nothing else. Since it did not make sense to me, I also tried to experiment with it in the terminal

$ set one="1" two="2" three="3"
$ files="${*:--}"
$ echo $files
one="1" two="2" three="3"
$ set four="4"
$ files="${*:--}"
four="4"

I can't seem to understand what it's doing. Could someone kindly help me with the interpretation of ${*:--} by the sh?

like image 876
user578 Avatar asked Sep 04 '26 18:09

user578


1 Answers

"$@" is an array of the arguments passed to your script, "$*" is a string of all of those arguments concatenated with blanks in between.

"${*:--}" is the string of arguments if any were provided (:-), or - otherwise which means "take input from stdin" otherwise.

"${@:--}" is the array of arguments if any were provided (:-), or - otherwise which means "take input from stdin" otherwise.

$ cat file
foo
bar

$ cat tst.sh
#!/usr/bin/env bash

awk '{ print FILENAME, $0 }' "${@:--}"

When an arg is provided to the script, "$@" contains "file" so that is the arg that awk is called with:

$ ./tst.sh file
file foo
file bar

When no arg is provided to the script, "$@" is empty so awk is called with - (meaning read from stdin) as it's arg:

$ cat file | ./tst.sh
- foo
- bar

You almost always want to use "${@:--}" rather than "${*:--}" in this context, see https://unix.stackexchange.com/questions/41571/what-is-the-difference-between-and for more info on "$@" vs "$*".

like image 81
Ed Morton Avatar answered Sep 07 '26 02:09

Ed Morton



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!