0

I want to read a file line by line as following:

while read line;
do
  set -- $line
  c=$#  #count words and save as $c
  r=$(( RANDOM%c ))
  #here i'd like to get the word on position r from $line
done < words.txt

I know, I can get word 1 as following:

set -- $line
echo $1

But how can I replace 1 with the integer saved in $r?

wjandrea
  • 28,235
  • 9
  • 60
  • 81
prog2de
  • 309
  • 2
  • 11

2 Answers2

1

Use indirection:

echo "${!r}"

For example:

$ set -- a b c
$ echo $2
b
$ v=2
$ echo ${!v}
b
wjandrea
  • 28,235
  • 9
  • 60
  • 81
  • On second thought, don't do this. Use an array instead. See [my other answer](https://stackoverflow.com/a/56793714/4518341) – wjandrea Jun 27 '19 at 14:52
1

Use an array instead:

words=($line)
echo "${words[$r]}"

For example:

$ var words
declare -a words='([0]="a" [1]="b" [2]="c")'
$ v=2
$ echo "${words[v]}"
c
$ echo "${words[v-1]}"
b
wjandrea
  • 28,235
  • 9
  • 60
  • 81