Я пытаюсь запустить приведенный ниже код на bash, но каждый раз, когда у меня появляется ошибка (недопустимый арифметический оператор), может кто-нибудь помочь
#!/bin/bash
for i in $(seq 20);
do
k=$(($i/100))
a=$((4.18+$k))
b=$(($a+0.01))
siesta < BiTeI.fdf > out_file #do the operation
lineno=939 # set the line number where the data you want to read is in
newline=$(sed -n "${lineno}p" "out_file") # asign a veriable for the line from the txt file note to change the file name
echo $newline >> output.txt # print the line extracted to an out put file note to generate file before adding to it
sed -i "30s/$a/${b}/" BiTeI.fdf # update the input file for new parameters for a specific raw
done
Трудно поверить, что в вашей системе не установлен bc. Что на выходе uname -srv? Скорее всего, вы перезаписали свою обычную переменную $PATH. Запустите новый терминал и введите следующий cmd echo $PATH. Вы видите такие имена, как /bin:/usr/bin:/sbin:/usr/sbin? Вам следует. Если вы это сделаете, в настоящее время проверит, доступен ли bc, т.е. which bc. Если он сейчас там, то посмотрите в своем скрипте, где вы сбрасываете PATH, вам нужен export PATH = "/new/dir:$PATH". Удачи.





Когда вы получаете сообщение об ошибке в bash, пора вернуться к отладке в строке печати. Добавьте set -x в начало скрипта после строки shebang. Затем перезапустите его. Баш скажет вам, что он делает.
line 8: 4.18 + 0: syntax error: invalid arithmetic operator (error token is ".18 + 0")
Итак, он говорит, что не знает, как разбирать части после 4: .18..... Это потому, что bash на самом деле не поддерживает десятичные дроби: Арифметика стиля Bash C со значением с плавающей запятой
Я понимаю ошибку, но каждый раз, когда я использую решение bc, я получаю bc: command not found
Что ж, вам нужно выбрать программу, которая поддерживает математические и десятичные дроби, установить ее и затем использовать. Если вам нужен bc, установите его. Если вы выберете python, установите его. Если вы не можете установить какие-либо программы, найдите установленный инструмент, поддерживающий десятичные дроби. У вас должен быть язык программирования немного на машине (perl, python, php, ruby ...), используйте его, если вы не можете найти что-нибудь еще.
Я пробовал это решение, и оно у меня работает
#!/bin/bash
echo $ result
for i in $(seq 20);
do
k=$(python -c "print($i/100)")
a=$(python -c "print(4.18+$k)")
b=$(python -c "print($a+0.01)")
echo $k
echo $a
echo $b
siesta < BiTeI.fdf > out_file #do the operation
lineno=939 # set the line number where the data you want to read is in
newline=$(sed -n "${lineno}p" "out_file") # asign a veriable for the line from the txt file note to change the file name
echo $newline >> output.txt # print the line extracted to an out put file note to generate file before adding to it
sed -i "30s/$a/${b}/" BiTeI.fdf # update the input file for new parameters for a specific raw
done
Благодарность
Будет быстрее, если вы сможете прочитать их все за один вызов Python. :)
Как бы мне ни не нравился awk, он может избавить вас от головной боли.
$: cat x
for i in $(seq 20)
do read k a b <<< "$( echo "$i" | awk '{
k = $1 / 100;
a = 4.18 + k;
b = a + 0.01;
printf "%.2f %.2f %.2f\n", k, a, b;
}' )"
echo "i=$i k=$k a=$a b=$b"
done
$: ./x
i=1 k=0.01 a=4.19 b=4.20
i=2 k=0.02 a=4.20 b=4.21
i=3 k=0.03 a=4.21 b=4.22
i=4 k=0.04 a=4.22 b=4.23
i=5 k=0.05 a=4.23 b=4.24
i=6 k=0.06 a=4.24 b=4.25
i=7 k=0.07 a=4.25 b=4.26
i=8 k=0.08 a=4.26 b=4.27
i=9 k=0.09 a=4.27 b=4.28
i=10 k=0.10 a=4.28 b=4.29
i=11 k=0.11 a=4.29 b=4.30
i=12 k=0.12 a=4.30 b=4.31
i=13 k=0.13 a=4.31 b=4.32
i=14 k=0.14 a=4.32 b=4.33
i=15 k=0.15 a=4.33 b=4.34
i=16 k=0.16 a=4.34 b=4.35
i=17 k=0.17 a=4.35 b=4.36
i=18 k=0.18 a=4.36 b=4.37
i=19 k=0.19 a=4.37 b=4.38
i=20 k=0.20 a=4.38 b=4.39
Я пробовал это, но каждый раз он говорит, что команда bc: не найдена