I don't know what you have against for i in "$@"; do..., but you can certainly do it with shift, for example:
while [ -n "$1" ]; do
printf " '%s'\n" "$1"
shift
done
Output
$ bash script.sh "abc.txt" "|" "20" "yyyy-MM-dd"
'abc.txt'
'|'
'20'
'yyyy-MM-dd'
Personally, I don't see why you exclude for i in "$@"; do ... it is a valid way to iterate though the args that will preserve quoted whitespace. You can also use the array and C-style for loop as indicated in the other answers.
note: if you are going to use your input array, you should use input=("$@") instead of input=($*). Using the latter will not preserve quoted whitespace in your positional parameters. e.g.
input=("$@")
for ((i = 0; i < ${#input[@]}; i++)); do
printf " '%s'\n" "${input[i]}"
done
works fine, but if you use input=($*) with arguments line "a b", it will treat those as two separate arguments.
for i in "$@"; do...? Do you just not like it?for i; do..., without addingin "$@". I think this is the most natural way to traverse over the input parameters.