How to do a circular shift of strings in bash?
A few tidbits that should help: when you call a function with a string, the string is split into multiple arguments (the positional parameters, named $n
, where n are integers starting at 1) on the characters in the variable $IFS
(which defaults to spaces, tabs and newlines)
function first() { echo $1}first one two three# outputs: "one"
$*
and $@
give you all the positional parameters, in order.
Second, the special variable $#
holds the number of arguments to a function.
Third, shift
discards the first positional parameter and moves up all the others by one.
function tail() { shift echo $*}
Fourth, you can capture the output of commands and functions using `...` or $(...)
rest=`tail $*`
Fifth, you can send the output of one command to the input of another using the pipe character (|
):
seq 5 | sort
To get you started, check out the read
builtin:
while read first_word rest_of_the_line; do ... your code here ...done
You also need a way to feed your input file into that loop.
Let me allow to show you a quick working example based on @outis answer:
strings="string1 string2 string3"next() { echo $1; }rest() { shift; echo $*; }for i in $strings; do echo $(next $strings) strings=$(rest $strings)done
Or other way-round if you're interested in traversing by sequence:
strings="string1 string2 string3"next() { echo $1; }rest() { shift; echo $*; }totalWords=$(c() { echo $#; }; c $strings)for i in `seq -w 1 $totalWords`; do echo $i: $(next $strings) strings=$(rest $strings)done