Назначить переменной в сценарии bash

Вы не можете сделать это с помощью одной зенитности в общем случае. Используя инструменты X11, вы можете запустить часы в строке заголовка диалогового окна zenity. Ниже я использовал xdotool, чтобы найти правильное окно и установить текст в строке заголовка

date_time=$(date +%d/%m/%Y\ %T)
new_date_time=$(date +%d/%m/%Y\ %T)

zenity --title "${date_time}" --display=:0 \
       --text="Running clock in window title bar" --list --radiolist \
       --column="select" --column="option" FALSE "1" FALSE "2" FALSE "3" &

while true
do
  sleep 1
  new_date_time=$(date +%d/%m/%Y\ %T)
  xdotool search --name "${date_time}" set_window --name "${new_date_time}"
  date_time="${new_date_time}"
done
0
06.03.2020, 13:29
3 ответа

Попробуйте это:

filename_result=contents
touch -- "$filename_result"

Или:

set contents
touch -- "$1"
6
28.04.2021, 23:21

set filename_result="contents"не присваивает значение filename_result. Он присваивается первому позиционному параметру, а само значение равно filename_result=contents. Пример:

$ set filename_result="contents"
$ echo "$1"
filename_result=contents

Переменная filename_resultне существует, $filename_resultрасширяется до нуля, а "$filename_result"эквивалентна "".

Вместо set filename_result="contents"нужно просто

filename_result="contents"
15
28.04.2021, 23:21

Кажется, вы хотите создать массив JSON с содержимым нескольких файлов JSON в качестве элементов. Я заметил, что вы опускаете запятую между содержимым каждого файла. Это приведет к недопустимому JSON.

Вместо этого вы можете заменить свой скрипт командой

jq -s../*.json >outfile

Это приведет к чтению всех файлов, имя которых соответствует *.jsonв текущем каталоге, и созданию единого массива с документом JSON каждого файла, являющимся элементом. Вывод будет записан в outfile.

jq— это синтаксический анализатор JSON командной строки, доступный для большинства Unices (проверьте свой менеджер пакетов ). Опция-s(или--slurp)делает именно то, что я только что описал (чтение в массив ).

.— это «идентификационный фильтр», который просто пропускает данные.


О вашем коде:

Помимо использования setдля попытки установить переменную (, на это уже указывал Камил Мациоровски , и именно так это делается в оболочках cshи tcsh. ), вывод можно упростить, сгруппировав некоторые команды, особенно те, которые находятся внутри цикла. touchтакже не требуется, так как перенаправление в не -существующий файл создает его.

Это мой собственный взгляд на проблему, который также вставляет отсутствующую запятую между содержимым каждого файла:

#!/bin/sh

outfile=outfile

# Will truncate (empty) the file if it exists,
# or create it if it doesn't.
echo '[' >"$outfile"

# Get a list of all JSON files into the list
# of positional parameters.
set --./*.json

# Loop over all but the last file.
# Output each file and a comma.
while [ "$#" -gt 1 ]; do
    # The "current" file that we're working on is "$1",
    # the first one in the list.

    cat "$1"
    echo,

    shift  # shifts this file off the list
done >>"$outfile

# The last file should not have comma after it.
{
    cat "$1"
    echo ']'
} >>"$outfile"

Цикл whileперебирает файлы JSON в списке позиционных параметров (список создается с помощьюset). Мы хотим вывести каждый файл, за которым следует запятая, но обрабатывать последний файл отдельно, так как после него не должно быть запятой (, это нарушит формат JSON ). Следовательно,цикл повторяется до тех пор, пока мы не сместим все, кроме последнего файла из списка($#— это длина списка позиционных параметров ).

Последний файл обрабатывается {...; }в конце. Группировка набора команд внутри фигурных скобок позволяет нам перенаправить вывод всех этих команд одновременно с помощью одного перенаправления. Точно так же вывод цикла может быть перенаправлен одним перенаправлением.


Тот же подход, но с использованием GNUawk:

awk 'BEGIN   { print "[" }
             { print }
     ENDFILE { if (FILENAME != ARGV[ARGC-1]) print "," }
     END     { print "]" }' *.json

GNU awkимеет, кроме стандартных BEGINи ENDблоков (, используемых здесь для вывода начального [и конечного ]разделителей массива ), BEGINFILEи блок ENDFILE. Неудивительно, что они ()запускаются до и сразу после обработки каждого отдельного входного файла. Мы используем здесь ENDFILEдля вывода запятой между содержимым каждого файла, за исключением последнего файла.

Блок { print }просто пропускает каждую строку каждого файла без изменений.

FILENAME, ARGVи ARGC— это переменные, которые GNU awkавтоматически заполнит текущим именем файла, списком аргументов, передаваемых сценарию (, именами файлов, в данном случае ), и количеством имен файлов., соответственно.

2
28.04.2021, 23:21

Теги

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