3 ms·
> I've always had trouble getting `for` loops to work predictably, so my common loop pattern is this: The problem with the pipe-while-read pattern is that you
by jolmg 5y ago
> I've always had trouble getting `for` loops to work predictably, so my common loop pattern is this:
The problem with the pipe-while-read pattern is that you can't modify variables in the loop, since it runs in a subshell.
- edgyquant 5y agoIt’s a trade off. I had to use a piped loop earlier this year to extract fallout new Vegas mods and textures since they all had spaces in their file names. For this it was perfect to pipe a list of the names to a loop, but for 99% of things I just use a for loop
- jolmg 5y agoYup. Nearly everything has tradeoffs. BTW, the problem I mentioned earlier can be avoided by using `< <()`: $ x=1 $ seq 5 | while read n; do (( x++ )); done $ echo $x 1 $ while read n; do (( x++ )); done < <(seq 5) $ echo $x 6 Almost makes me wonder what the benefit of preferring a pipe here is. I guess it's just about not having to specify what part of the pipeline is in the same shell.
- edgyquant 5y agoIt’s funny I’ve been using Linux for a decade and a half, professionally for about half that time, and yet I still go to python when arithmetic is involved. I’ve been learning a lot about the shell lately it’s like I did the bare minimum with bash just to be able to run programs and slightly automate things and it took this long for it to click with me that it’s a productive programming language in its own right (and probably faster than python.)
- chasil 5y agoWith the original Borne shell, the exper command was used for arithmetic. The POSIX shell allows the $(( form for native shell arithmetic, but not the (( alternative found in bash and Korn.
- yesenadam 5y agoI use "python calc" for quick calculations at the command line: pc () { python3 -c "print($*)" ; } $ pc 3.5**2.4 20.219169193375105 Or "awk calc", which seems much faster: (and ^ and ** both work for powers) calc () { awk "BEGIN{print $*}" ; } $ calc 3.5**2.4 20.2192
- chubot 5y agoBTW you can make it work in bash by setting shopt -s lastpipe. It runs the last part of the pipeline in the main shell, so the mutation variables of will persist. Both OSH and zsh behave that way by default, which was tangential to a point in the latest release notes https://news.ycombinator.com/item?id=29292187 https://news.ycombinator.com/item?id=29292187 Another trick I've seen in POSIX shell is to add a subshell after the pipeline until the last time you want to read the variable. Like cat foo.txt | ( while read line; do f=$line done echo "we're still in the subshell f=$f" )