Спасибо за ответы
@wurtel :Спасибо за ссылку, теперь все отлично работает
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 243M 0 part /boot
└─sda2 8:2 0 19,8G 0 part
├─vgsys-root 254:0 0 109,5G 0 lvm /
├─vgsys-var 254:1 0 1,9G 0 lvm /var
├─vgsys-usr 254:2 0 3,8G 0 lvm /usr
├─vgsys-home 254:3 0 1,9G 0 lvm /home
├─vgsys-tmp 254:4 0 1,9G 0 lvm /tmp
└─vgsys-swap 254:5 0 732M 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part
└─vgsys-root 254:0 0 109,5G 0 lvm /
sr0 11:0 1 1024M 0 rom
Обязательноеawk
-основанное решение (, где для простоты я буду предполагатьn>2
):
awk -v n=9 'BEGIN{q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
Пользовательский ввод сохраняется в переменной n
и передается в awk
через команду -строковый аргумент -v n=number
.
Для немедленного выхода, еслиn<3
:
awk -v n=9 'BEGIN{if (n<3) exit; q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
Пояснение
awk
— это инструмент обработки текста -, мы «творчески злоупотребляем» им. Поэтому все происходит внутри блока BEGIN
, который обычно содержит код, выполняемый до обработки первого входного файла.
Сам синтаксис очень похож -на C, поэтому мы
n>2
):printf "0,*,"
2
до n-1
и вычислить число Фибоначчи s
как сумму двух предыдущих q
и r
и обновить q
иr
*
, если i
четное, либо текущее число Фибоначчи s
, если оно не четное(i%2?"*":s
),
, либо новую строку после этого, в зависимости от того, достигли ли мы конца цикла(i==n-1
)или нет. Наиболее близким к вашему коду с использованием Bash и арифметических операторов является этот:
#!/bin/bash
let UserInput=9
let a=0
let b=1
echo -n "The Fibonacci series is: 0"
for (( i=1; i<UserInput; i++ )) ; do
let sn=a+b
let a=b
let b=sn
if (( i % 2 == 0 )) ; then
echo -n ",$a"
else
echo -n ",*"
fi
done
echo
В операторе if
вы должны использовать оператор %
по модулю (остатка ). Используя его, вы можете проверить, делится ли i
на два (, то есть четное число ), и вывести значение $a
или вывести *
соответственно.
Вывод будет:
The Fibonacci series is: 0,*,1,*,3,*,8,*,21
Чтобы изменить сценарий, чтобы он получал количество шагов из своего аргумента , измените первую строку сценария следующим образом:
let UserInput="$1"