954,123 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Arithmetic Evaluation and Pipes in BASH

Hi,

I had some irritation with a "while"- loop, which turned out to be endless.
Anyway, i was able to find the problem and reduce it to be shown on the commandline:

I "typeset" (and initialize) an array and an integer variable:

$ typeset -a arr; arr=(bourne again shell)
$ typeset -i ind=0


Everything works as expected when doing:

$ echo ${arr[((ind++))]}
bourne
$ echo ${arr[((ind++))]}
again
$ echo ${arr[((ind++))]}
shell


But when i use the "echo" command in a pipe, (like:)

$ typeset -i ind=0
$ echo ${arr[((ind++))]} | grep e
bourne


the postincrement of "ind" is not evaluated, so the next time i also get:

$ echo ${arr[((ind++))]} | grep e
bourne
$ echo ${arr[((ind++))]} | grep e
bourne


Well, this is not really a problem for i can do it in two lines, but i wonder, if it's possible to make it work in one line.

Anywone who can give a comment?

Thanks for reading and trying to help!
Bye,
Christoph

chrissi
Newbie Poster
1 post since Mar 2005
Reputation Points: 10
Solved Threads: 0
 

Christoph,

The answer is that every member of a pipeline is turned into a separate process with its own environment. So changing the variable in a pipeline changes it in a subshell and not the current shell.

You'll have to change the value of the variable after invoking the pipe.

Hi,

I had some irritation with a "while"- loop, which turned out to be endless. Anyway, i was able to find the problem and reduce it to be shown on the commandline:

I "typeset" (and initialize) an array and an integer variable:

$ typeset -a arr; arr=(bourne again shell)
$ typeset -i ind=0

Everything works as expected when doing:

$ echo ${arr[((ind++))]}
bourne
$ echo ${arr[((ind++))]}
again
$ echo ${arr[((ind++))]}
shell

But when i use the "echo" command in a pipe, (like:)

$ typeset -i ind=0
$ echo ${arr[((ind++))]} | grep e
bourne

the postincrement of "ind" is not evaluated, so the next time i also get:

$ echo ${arr[((ind++))]} | grep e
bourne
$ echo ${arr[((ind++))]} | grep e
bourne

Well, this is not really a problem for i can do it in two lines, but i wonder, if it's possible to make it work in one line.

Anywone who can give a comment?

Thanks for reading and trying to help! Bye, Christoph

atucsprof
Newbie Poster
1 post since Jun 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You