I am trying to delete some files with loop. But can't figure out the way of doing it. Here's what I am trying to do:
#!/bin/bash
dir1=/path/to/file
dir2=/path/to/file
dir3=/path/to/file
for i in 1 2 3
do rm ${dir$i}
done 1 2 Answers
This is possible with eval, but I'd strongly advice not to use that!
Use an array instead:
dirs=(
"/path/to/file1"
"/path/to/file2"
"/path/to/file3"
)
for i in 0 1 2
do rm "${dirs[$i]}"
done
# OR simply loop all the array values:
for dir in "${dirs[@]}"
do rm "$dir"
doneNote, that arrays are 0-based.
5You can do it in bash with indirection
If the first character of parameter is an exclamation point (!), and parameter is not a nameref, it introduces a level of indirection. Bash uses the value formed by expanding the rest of parameter as the new pa‐ rameter; this is then expanded and that value is used in the rest of the expansion, rather than the expansion of the original parameter. This is known as indirect expansion.
but it requires an intermediate variable ex. given:
dir1=/path/to/file1
dir2=/path/to/file2
dir3=/path/to/file3then
$ for i in 1 2 3; do d=dir$i; echo rm "${!d}"; done
rm /path/to/file1
rm /path/to/file2
rm /path/to/file3You could eliminate the intermediate variable by looping over strings dir1 dir2 dir3 using brace expansion:
for d in dir{1..3}; do echo rm "${!d}"; doneThe same feature is available in zsh using the P modifier:
% for i in 1 2 3; do d=dir$i; echo rm ${(P)d}; doneSee Use a variable reference "inside" another variable
1