Невозможно назначить вывод вложенных команд переменной в bash

Я пытался назначить ниже команду (которая выбирает случайную строку из файла) для переменной, но не работает.

givinv@87-109:~$ head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1 cower givinv@87-109:~$ 

Ниже ошибки, которую я получаю, пытаясь присвоить ее переменной.

 givinv@87-109:~$ VARIA=`head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1` bash: command substitution: line 1: unexpected EOF while looking for matching `)' bash: command substitution: line 2: syntax error: unexpected end of file bash: command substitution: line 1: syntax error near unexpected token `)' bash: command substitution: line 1: ` + 1)) file | tail -1' -l: command not found givinv@87-109:~$ 

Я даже пробовал то же самое для цикла и не работал ::

 givinv@87-109:~$ for i in `head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1`;do echo $i ;done bash: syntax error near unexpected token `<' givinv@87-109:~$ 

3 Solutions collect form web for “Невозможно назначить вывод вложенных команд переменной в bash”

Это не работает, потому что вы пытаетесь вложить необработанные обратные ссылки:

 VARIA=`head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1` 

Это на самом деле пытается сначала запустить head -$((${RANDOM} % как единую команду, и это дает вам две первые ошибки:

 $ VARIA=`head -$((${RANDOM} % ` bash: command substitution: line 1: unexpected EOF while looking for matching `)' bash: command substitution: line 2: syntax error: unexpected end of file 

Затем он пытается запустить

 wc -l < file` + 1)) file | tail -1` 

Это означает, что он пытается оценить + 1)) file | tail -1 + 1)) file | tail -1 (который находится между backticks), и это дает вам следующие ошибки:

 $ wc -l < file` + 1)) file | tail -1` bash: command substitution: line 1: syntax error near unexpected token `)' bash: command substitution: line 1: ` + 1)) file | tail -1' 

Вы можете обойти это, избегая обратных шагов:

 VARIA=`head -$((${RANDOM} % \`wc -l < file\` + 1)) file | tail -1` 

Однако, как правило, обычно лучше не использовать обратные сигналы вообще. Вы должны почти всегда использовать $() . Он более надежный и может быть вложен неограниченно с более простым синтаксисом:

 VARIA=$(head -$((${RANDOM} % $(wc -l < file) + 1)) file | tail -1) 

просто используйте эту команду

 VARIA=$(head -n "$((${RANDOM} % $(wc -l < test) + 1))" test | tail -n 1) 

для присвоения результата команде переменной мы используем $(...) (древняя форма `...` сложнее вложить).

В качестве другого варианта для чтения случайной строки из файла (и назначения его переменной) рассмотрим упрощенный метод выборки коллектора, преобразованный из perl в awk, с улучшением посева Peter.O :

 VARIA=$(awk -v seed=$RANDOM 'BEGIN { srand(seed) } { if (rand() * FNR < 1) { line=$0 } } END { print line }' /usr/share/dict/words) 

Вот скрипт awk, красиво завернутый:

 awk -v seed=$RANDOM ' BEGIN { srand(seed) } { if (rand() * FNR < 1) { line=$0 } } END { print line }' /usr/share/dict/words 

из-за того, как работает awk srand() , вы получите то же значение, если запустите этот скрипт за ту же секунду, если только вы не засеете его чем-то еще случайным. Здесь я выбираю слова из / usr / share / dict / words, как источник текста.

Этот метод не волнует, сколько строк в файле (моя локальная копия имеет 479 828 строк), поэтому она должна быть довольно гибкой.

  • Использование «$ {a: -b}» для назначения переменных в скриптах
  • Установка переменной со значением по умолчанию ведет себя по-другому, если перед командой?
  • Разделить команду и аргументы и вставить в переменную в сценарий bash
  • Каков наиболее эффективный способ grep для двух совершенно разных вещей и присвоения значений отдельным переменным?
  • Объем переменных при вызове функции из find
  • Установка переменной, значение которой зависит от другой переменной
  • Как выбрать количество цифр в переменной в моих сценариях?
  • Bash: Объем переменных в цикле for с использованием тройника
  • Отложить переменное расширение до подоболочки
  • Shell: как использовать 2 переменные с условием
  • Несколько входов в одной команде
  • Linux и Unix - лучшая ОС в мире.