1: команда не найдена - PullRequest
       35

1: команда не найдена

3 голосов
/ 04 ноября 2011

Я пишу функцию деления на три в Bash, и она не позволит мне установить переменную в число.

fizzy.sh:

#!/usr/bin/env sh

div3() {
    return `$1 % 3 -eq 0`
}

d=div3 1
echo $d

Пример:

$ ./fizzy.sh 
./fizzy.sh: line 7: 1: command not found

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Функции Bash обычно «возвращают» значения, печатая их на стандартный вывод, где вызывающий может захватить их, используя

`func args ...`

или

$(func args ...)

Это заставляет функции работать как внешние команды.

Оператор return, с другой стороны, устанавливает значение $?. Обычно это будет установлено на 0 для успеха, 1 для сбоя или какое-то другое значение для указанного типа сбоя. Думайте об этом как код состояния, а не общее значение. Вполне вероятно, что это будет поддерживать только значения от 0 до 255.

Попробуйте вместо этого:

#!/bin/sh

div3() {
    expr $1 % 3 = 0   # prints "0" or "1"
}

d=$(div3 1)
echo $d

Обратите внимание, что я также изменил строку Шебанга с #!/usr/bin/env sh на #!/bin/sh. Трюк #!/usr/bin/env часто используется при вызове интерпретатора (например, perl), который вы хотите найти с помощью $PATH. Но в этом случае sh будет , всегда будет в /bin/sh (система сломалась бы различными способами, если бы не было). Единственная причина написать #!/usr/bin/env sh состоит в том, что вы хотите использовать любую команду sh, которая появляется первой в вашем $PATH, а не в стандартной. Даже в этом случае вам, вероятно, лучше указать путь к sh напрямую.

2 голосов
/ 04 ноября 2011

Виновной является строка

 d=div3 1

, поскольку вы присваиваете строку div3 переменной env d и пытаетесь выполнить 1. Чтобы избежать этого, используйте обратные кавычки, чтобы вместо этого присваивать результат оценки:1004 *

 d=`div3 1`

Затем в вашей функции оценки возникает другая ошибка.Вам нужно запустить проверку своих аргументов вместо того, чтобы пытаться оценить их как команду:

return `test $(($1 % 3)) -eq 0`

По-прежнему нет выходных данных, но нет и ошибок.Каков будет ваш ожидаемый результат, на самом деле?

1 голос
/ 04 ноября 2011
div3() {
    return $(( ( $1 % 3 ) == 0 ))
}

d=$(div3 1)
rc=$?

echo $d
echo $rc


(blank line)
0

Обратите внимание, return просто устанавливает значение $?чтобы функция возвращала значение, просто распечатайте его.

div3() {
    printf $(( ( $1 % 3 ) == 0 )) "\n"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...