Я не думаю, что Вам нужна исполнительная команда в Вашем примере. Можно ли попробовать nohup строку без него? Попробуйте это:
nohup sh -c "$FISHEYE_CMD $@ $FISHEYE_ARGS >> $FISHEYE_INST/var/log/fisheye.out 2>&1" &
Если вышеупомянутое не работает, можно хотеть попытаться использовать bash
вместо sh
. Попробуйте это:
nohup bash -c "$FISHEYE_CMD $@ $FISHEYE_ARGS >> $FISHEYE_INST/var/log/fisheye.out 2>&1" &
Наконец, если бы ни одно из этих предложений работа, я попытался бы избавиться от "оболочки-c" аргумент все вместе. Попробуйте это:
nohup "$FISHEYE_CMD $@ $FISHEYE_ARGS >> $FISHEYE_INST/var/log/fisheye.out 2>&1" &
На 5-й линии:
Изменить $x=(($x + 1))
на x=$(($x + 1))
.
Вместо того, чтобы использовать весь скрипт bash, вы можете просто использовать seq 1 50
.
Если бы дело было x=$(($x + 2))
, вы могли бы использовать seq 1 2 50
, где 2 обозначает шаг/включение.
Bash
, как ksh ksh
и, возможно, некоторые другие снаряды в родом поддерживают арифметические петли:
for ((x=1;x<=50;x++)); do
echo $x
done
Другие ответы могут обращаться Как отладить свой скрипт. Этот ответ показывает вам более простой (и менее подверженный ошибкам) способ сделать то, что вы хотите использовать расширение Bash , чтобы генерировать диапазон вместо увеличения петли.
Например, для печати чисел 1- 50, используя эту запись, вы можете использовать следующий фрагмент:
for x in {1..50}; do
echo $x
done
Это правильно напечатает каждое число в последовательности, но полагается на функции Bash, которые не являются портативными через оболочки. Если вам нужна портативность, рассмотрите возможность использования SEQ вместо этого.
На линии 5:
Измените $ x = (($ x + 1))
на x = $ (($ x + 1))
.
Вместо использования всего сценария bash можно использовать seq 1 50
.
В случае x = $ (($ x + 2))
можно использовать seq 1 2 50
, где 2 обозначает шаг/приращение.
Оболочка не является (хорошим) языком программирования, это (прежде всего) интерпретатор командной строки. Если требуется выполнить подсчет, используйте команду подсчета, а не команды echo
и [
в цикле.
Например, системы GNU имеют для этого команду seq
. Альтернативные варианты: awk
или bc
например:
seq 50
echo 'for (i=1; i<=50; i++) i' | bc
awk 'BEGIN {for (i=1; i<= 50; i++) print i}'
Если вы обнаружите, что используете петлю в оболочках, возможно, вы идете к неправильному подходу.
Существует программное обеспечение под названием BASH отладчик и другое программное обеспечение будет shellcheck , которое даст вам общие ошибки, но не все.
В вашем скрипте в строке 5 используйте квадратные скобки:
x=$[ $x + 1 ]
Обновление
Или
x=$(( $x + 1 ))
Первая из них описана, лучше использовать вторую. Не используйте $
перед x
, который идет перед знаком =
Из вашего другого вопроса об округлении десятичных дробей, я вижу, что вы хотите сделать это только на бэше. Так что, кроме других ответов, вы можете сделать это и так.
#!/bin/bash
x=1
while [[ $x -le 50 ]]
do
echo $x
x=$(expr $x + 1)
done
#!/bin/bash
for i in $(seq 1 50)
do
echo $i
done
изменить :извините за публикацию моего ответа, не прочитав путеводитель, и спасибо Стивену Китту за редактирование моего ответа.
Таким образом, в этом скрипте я получаю вывод seq 1 50 с подстановкой команд $()
и повторяю эту выводную (последовательность чисел от 1 до 50 )с помощью for
и печатаю каждый i
в этой последовательности сecho $i
И только потому, что вы пытаетесь вывести числа с помощью цикла, я реализую это с помощью цикла. seq 1 50
или echo {1..50}
также дадут эти числа без использования итерации.