Создание файлов с несколькими переменными

Я пытался записать исполняемый сценарий, который создает файлы, содержащие несколько переменных.

Здесь, x варьируется от 1 до 25, z от 5 до 7 на шагах 0,1, пока y и w константы. Следовательно, для каждого значения x, должен быть 21 файл. Я попробовал ниже, однако я не могу получить голову вокруг, как такой вложенный для цикла должен работать.

mkdir dir
for ((i=1;i<=25;i++)); do
    printf 'x=%s\ny=4\n' "$i"
    for ((j=5;j<=7;j=j+0.1));do
        printf 'z=%s\nw=4\n' "$j" > dir/diles_$i_$j.txt
done

Кроме того, как я могу сделать этот исполняемый файл? Я работаю над Ubuntu.

2
задан 13 December 2019 в 16:46

1 ответ

Вот Ваше решение:

#! /bin/bash

mkdir dir
for ((i=1;i<=25;i++)); do
    printf 'x=%s\ny=4\n' "$i"
    for ((j=50;j<=70;j++));do
        t=$(bc <<< "scale=1; $j/10")
        printf 'z=%s.1f\nw=4\n' "$t" > dir/diles_$i\_$t.txt
    done
done

Объяснение:

  • работы Bash только [1 128] с целым числом, таким образом, Вы не можете сделать своего цикла с плаванием / десятичное число (Вы видите, что я просто использую подразделение 10 ниже)
  • Мы используем bc команда, которые преобразовывают целочисленную операцию (подразделение, например) для получения плавания; scale шоу оператора, сколько десятичного числа мы хотим иметь (здесь, 1 suffisant, чтобы не иметь, многие 0, как bc -l делают)
  • , мы должны добавить \\ в имени файла, потому что это не заботилось о i для именования файлов <час> ifnot

кроме того, я указал, что 1-е printf команда просто печатает результат как этот в терминале, вероятно, Вы добавили бы их в каждом файле (вместо дисплея терминала), таким образом, необходимо использовать код ниже в этом случае:

#! /bin/bash

mkdir dir
for ((i=1;i<=25;i++)); do
    for ((j=50;j<=70;j++));do
        t=$(bc <<< "scale=1; $j/10")    
        printf 'x=%s\ny=4\n' "$i" > dir/diles_$i\_$t.txt
        printf 'z=%s.1f\nw=4\n' "$t" >> dir/diles_$i\_$t.txt
    done
done

NB: >> оператор или 2-е printf команда важна здесь (1-й printf, не заботился, зависит, только если Вы хотите заботиться о предыдущих данных - >> - или не - >), потому что, если бы Вы используете просто > операнд, Вы стерли бы все предыдущие данные (таким образом, вывод 1-го printf будет удален)

Источники:

1
ответ дан 21 December 2019 в 23:34

Другие вопросы по тегам:

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