Невозможно назначить вывод вложенных команд переменной в 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 строк), поэтому она должна быть довольно гибкой.

  • захватить из текстового файла диапазон с использованием двух переменных в качестве начального и конечного параметров
  • Shell: как использовать 2 переменные с условием
  • Как изменить переменные
  • Как передать переменную в sftp?
  • Могу ли я определить тип переменной awk?
  • Невозможно выполнить сценарий Bash, если / while
  • В сценарии bash, что отличается между объявлением и нормальной переменной?
  • отображение PID
  • Удалить определенное слово в переменной
  • dirname и basename против расширения параметров
  • Как вы обрабатываете несколько правил валидации при различных пользовательских вводах?
  • Interesting Posts

    kexec сбой при загрузке ядра без initramfs (ARM)

    файлы и каталоги не распространяются на удаленный сервер с разрешением 777 с использованием sshfs

    Эффективное использование dd (буфер много блоков, процесс по одному)

    Как видеть пароль при вводе текста

    Как определить, какой сервис запускается во время загрузки, отвечает за определенное поведение?

    Как я могу наблюдать за созданием определенного «триггерного файла»?

    Установить значения по умолчанию в чашках?

    Как вызвать chmod и сохранить бит SGID?

    Почему cron не работает автоматически?

    Найдите идентификатор процесса приложения java в сценарии bash (чтобы узнать, запущено ли целевое приложение)

    инструмент производителя обнаружил плохие блоки, но smartctl не показывает никаких

    Выбор текста в rxvt-unicode и tmux с отключением мыши

    Возвращение из Nvidia обратно в Нуво

    insmod: не может вставить './intrpt.ko': функция не реализована

    не удалось изменить масштабирование i3wm

    Linux и Unix - лучшая ОС в мире.