Pull to refresh

Воспроизведение случайного файла? Одна строчка на bash

Reading time 2 min
Views 5.2K
После того, как я записал на гитаре две ноты — F♯ и E♭ — я стал думать, как случайным образом выбрать одну из них и воспроизвести, чтобы можно было послушать и, затем, посмотреть на экран.

Сначала я решил, что стоит написать небольшую программу на Python или Ruby. Но потом я подумал, что можно написать это просто на bash.

С помощью команды «set --» можно установить позиционные параметры (positional parameters). Первый переданный после «--» параметр будет $1, второй $2, и так далее.

Установим в качестве параметров два имени файла — один файл с нотой фа-диез, а другой с ми-бемоль.

set -- "e_flat.wav" "f_sharp.wav"

Кстати, с помощью «set -- *» можно задать как позиционные параметры все файлы и папки в текущей директории.

Теперь зададим случайное число. Сделать это можно командой shuf.

shuf -i 1-2 -n 1

То есть одно (-n 1) случайное число от 1 до 2 (-i 1-2).

Чтобы использовать в bash результат выполнения команды в качестве значения — если мы хотим его вывести или, как сейчас, записать в переменную — команду достаточно поместить в круглые скобки, поставив перед ними знак доллара ($).

random=$(shuf -i 1-2 -n 1)

Конструкция ${!var} позволяет получить переменную, имя которой содержится в переменной var (bash indirect reference). Если выполнить test=PATH и, затем, echo ${!test} — то отобразится содержимое переменной $PATH.

Таким образом, ${!random} — содержимое переменной, название которой записано в переменную random. А туда в нашем случае записано либо 1, либо 2 — то есть будет отображено содержимое либо переменной $1, либо $2.

Что ж, вот мы всё и написали. Остаётся запустить.

set -- "e_flat.wav" "f_sharp.wav" ; random=$(shuf -i 1-2 -n 1) ; mplayer ${!random}

То есть мы ещё раз убедились, что на bash можно писать очень много разных вещей, и зачастую, если есть какая-то конкретная ситуация, в которой нужно, чтобы компьютер что-то сделал, то bash — идеальный вариант для этого.
Tags:
Hubs:
+16
Comments 32
Comments Comments 32

Articles