diff --git a/SC2066.md b/SC2066.md new file mode 100644 index 0000000..b242b8e --- /dev/null +++ b/SC2066.md @@ -0,0 +1,36 @@ +## Since you double quoted this, it will not word split, and the loop will only run once. + +### Problematic code: + + for s in "$(mycommand)"; do echo "$s"; done + +### Correct code: + +The correct code depends on your intention. Let's say you're in a directory with the files `file.png` and `My cat.png`, and you want to loop over a command that outputs (or variable that contains): + + hello world + My *.png + +#### Loop over each line without globbing (`hello world`, `My *.png`) + + mycommand | while IFS= read -r s; do echo "$s"; done + +#### Loop over each word with globbing (`hello`, `world`, `My`, `file.png`, `My cat.png`): + + # relies on the fact that IFS by default contains space-tab-linefeed + for s in $(mycommand); do echo "$s"; done + +#### Loop over each line with globbing (`hello world`, `My cat.png`) + + # explicitly set IFS to contain only a line feed + IFS=' + ' + for s in $(mycommand); do echo "$s"; done + +### Rationale: + +You get this warning because you have a loop that will only ever run exactly one iteration. Since you have a loop, you clearly expect it to run more than once. You just have to decide how it should be split up. + +### Contraindications + +None. \ No newline at end of file