не вычислять переменные перед выполнением цикла for - PullRequest
0 голосов
/ 10 октября 2011

Есть ли какой-нибудь хак, чтобы не оценивать переменные в bash до времени выполнения?У меня есть такой цикл for: проблема в том, что он у меня внутри эха ... в противном случае это прекрасно работает!

for i in $(seq 0 100); do echo $(echo $RANDOM % 10 | bc); done

результат, например, всегда 3 ...

Ответы [ 5 ]

3 голосов
/ 10 октября 2011

Рядом с вашей проблемой: ваше решение использует 2 внешних процесса, 1 канал, 1 подпроцесс для тривиального упражнения.Чистая Баш:

for (( CNTR=0; CNTR<=100; CNTR+=1 )); do
  echo  $((RANDOM%10))
done
0 голосов
/ 10 октября 2011

Традиционное решение, когда вы хотите прервать интерполяцию переменных, это использовать кавычки и eval. Это не так элегантно, как решение для чистого Bash, но, очевидно, более переносимо.

 for i in $(seq 0 100); do
   eval 'echo $RANDOM % 10 | bc'
 done

Это просто минимальный рефакторинг вашего исходного кода, и я публикую его только для полноты.

0 голосов
/ 10 октября 2011

В качестве альтернативы можно использовать расширение скобки:

for i in {0..100}; do
  echo $((RANDOM%10))
done
0 голосов
/ 10 октября 2011

Это работает для меня.

for i in $(seq 0 100);

do
    echo $RANDOM % 10 | bc
done

Понятно ... с эхом у меня это работает:

for i in $(seq 0 100);

do
    echo "foo $(echo $RANDOM % 10 | bc)"
done
0 голосов
/ 10 октября 2011

У вас здесь есть пара проблем, и я не думаю, что какая-либо из них связана с вычислением переменных.

Во-первых, $RANDOM здесь не определено.Может быть, у вас где-то установлено значение 3, и поэтому вы всегда получаете 3 в качестве вывода?

Во-вторых, вам не нужны оба этих echo s.Опустите внешнее, вместе с $() вокруг другого.

...