Сценарий BASH: Как присвоить каждой строке вывода команды значения в массиве?

Специально для этой цели я создал сценарий.https://github.com/aaronfranke/Linux-tools/blob/master/all-distros/autoscan.sh

Перед запуском отредактируйте переменные вверху. Вы должны указать адрес вашего принтера, который можно узнать, запустив scanimage -L. Вы также можете указать временной интервал, формат и качество (PPI ). Сценарий сохранит ваши отсканированные изображения в файле со случайным именем из 6 -символов.

Примечание. :Этот сценарий требует установки команд scanimageи mogrify.

#!/bin/bash

# autoscan.sh - A script for automatically scanning from a printer/scanner and saving to a random file.

# Must be set to your printer's address. Use `scanimage -L` to get a list of printers.
PRINTER="hpaio:/net/OfficeJet_4650_series?ip=192.168.0.100"

# Optional variables, feel free to adjust.
TIME=30     # TIME (in seconds), should be at least 10.
FORMAT=jpg  # FORMAT must be understood by mogrify. Ex: jpg, png, tiff, bmp.
QUALITY=200 # QUALITY must be supported by your printer. Common ones are 300, 200, 150, and 75.




if [ ! -f /usr/bin/scanimage ]; then
    echo "This script requires the \`scanimage\` command, which was not found. Exiting. "
    exit 1
fi
if [ ! -f /usr/bin/mogrify ]; then
    echo "This script requires the \`mogrify\` command from the \`imagemagick\` package, which was not found. Exiting. "
    exit 2
fi

echo " "
echo "Computer will start automatically scanning in a few seconds... "
SLTIME=$(($TIME-5))
sleep 5

while true; do
    FILENAME=$(mktemp -u XXXXXX)
    echo " "
    echo "Scanning and saving to $FILENAME.$FORMAT... "
    scanimage -d $PRINTER --mode Color --resolution $QUALITY --format tiff > $FILENAME.tiff 2>/dev/null
    mogrify -format $FORMAT $FILENAME.tiff
    rm $FILENAME.tiff
    echo " "
    echo "Done scanning $FILENAME.$FORMAT, waiting $TIME seconds for next scan... "
    sleep $SLTIME
    echo " "
    echo "5... "
    sleep 1
    echo "4... "
    sleep 1
    echo "3... "
    sleep 1
    echo "2... "
    sleep 1
    echo "1... "
    sleep 1
done

7
19.09.2019, 18:23
1 ответ

Использование readarrayв оболочке bashи GNUsed:

readarray -t my_array < <( my_command | sed '1~2d' )

Встроенный -в readarrayсчитывает строки в массив. Строки считываются из процесса подстановки. Команда sedв подстановке процесса будет выводить только каждую вторую строку, прочитанную из my_command(, и также может быть записана как sed '1!n;d'или как sed -n 'n;p'со стандартнымsed).

В GNU sedадрес n~mобращается к каждой m:-й строке, начиная со строки n. Это расширение GNU к стандарту sedдля удобства.

Команда my_commandбудет вызвана только один раз.

Тестирование:

$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10
13
28.04.2021, 23:29

Теги

Похожие вопросы