let count++ gives a warning suggesting (( count++ )) instead. The deleted "Equivalently" code was _not_ equivalent and it didn't work because count was modified in a subshell (as shellcheck itself points out)

Stephen Checkoway
2023-06-15 12:30:31 -04:00
parent 11f3757042
commit fec6fe251f

@@ -5,7 +5,7 @@
```sh ```sh
for file in $(find mydir -mtime -7 -name '*.mp3') for file in $(find mydir -mtime -7 -name '*.mp3')
do do
let count++ (( count++ ))
echo "Playing file no. $count" echo "Playing file no. $count"
play "$file" play "$file"
done done
@@ -23,25 +23,13 @@ The most general fix (that requires the least amount of thinking to apply) is ha
```sh ```sh
while IFS= read -r -d '' file while IFS= read -r -d '' file
do do
let count++ (( count++ ))
echo "Playing file no. $count" echo "Playing file no. $count"
play "$file" play "$file"
done < <(find mydir -mtime -7 -name '*.mp3' -print0) done < <(find mydir -mtime -7 -name '*.mp3' -print0)
echo "Played $count files" echo "Played $count files"
``` ```
> Equivalently:
>
> ```sh
> find mydir -mtime -7 -name '*.mp3' -print0 | while IFS= read -r -d '' file
> do
> let count++
> echo "Playing file no. $count"
> play "$file"
> done
> echo "Played $count files"
> ```
In usage it's very similar to the `for` loop: it gets its output from a `find` statement, it executes a shell script body, it allows updating/aggregating variables, and the variables are available when the loop ends. In usage it's very similar to the `for` loop: it gets its output from a `find` statement, it executes a shell script body, it allows updating/aggregating variables, and the variables are available when the loop ends.
It requires Bash, and works with GNU, Busybox, OS X, FreeBSD and OpenBSD find, but not POSIX find. It requires Bash, and works with GNU, Busybox, OS X, FreeBSD and OpenBSD find, but not POSIX find.
@@ -54,7 +42,7 @@ If you don't need `find` logic like `-mtime -7` and just use it to match globs r
shopt -s globstar nullglob shopt -s globstar nullglob
for file in mydir/**/*.mp3 for file in mydir/**/*.mp3
do do
let count++ (( count++ ))
echo "Playing file no. $count" echo "Playing file no. $count"
play "$file" play "$file"
done done