How to do a circular shift of strings in bash? How to do a circular shift of strings in bash? shell shell

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