LINUX.ORG.RU

Не работает скрипт: слишком много аргументов

 ,


0

1

День/Вечер добрый. Тут решил засесть за книжку «Сценарии командной оболочки» и на втором скрипте получил ошибку. далее привожу код скрипта и ошибки.

#!/bin/bash
in_path()
{
    cmd=$1     ourpath=$2    result=1    oldIFS=$IFS
    IFS=":"

    for directory in "$ourpath"
    do
        if [ -x $directory/$cmd ] ; then
            result=0
        fi
    done

    IFS=$oldIFS
    return $result
}
checkForCmdInPath()
{
    var=$1
    if [ "$var" != "" ] ; then
        if [ "${var:0:1}" = "/" ] ; then
            if [ ! -x $var ] ; then
                return 1
            fi
        elif ! in_path $var "$PATH" ; then
            return 2
        fi
    fi
}

if [ $# -ne 1 ] ; then
    echo "Usage: $0 command" >&2 ; exit 1
fi

checkForCmdInPath "$1"
case $? in
    0 ) echo "$1 found in PATH"               ;;
    1 ) echo "$1 not found or not executable" ;;
    2 ) echo "$1 not found in PATH"           ;;
esac

exit 0

./inpath.sh: line 9: [: слишком много аргументов
ls not found in PATH

Еще простой (наверное) вопрос, если пошлете учить матчасть - укажите направление :)

echo "Usage: $0 command" >&2 ;
Це шо вообще такое?! Вообще синтаксис у баша странный конечно... Матчасти мне, матчасти!

for directory in «$ourpath»

Все, что в двойных скобкаъ считается одним словом, разбивки не происходит, это эквивалентно directory=$ourpath

if [ -x $directory/$cmd ] ; then

А здесь двойных скобок нет, поэтому разбивка слов происходит и команда разбивается на if [ -x /bin /usr/bin … и что там ещё в $PATH

redgremlin ★★★★★ ()

Матчасти мне, матчасти!

google://advanced bash scripting guide

redgremlin ★★★★★ ()
Ответ на: комментарий от sudoLife

Так потому что разбор $ourpath на слова уже произошёл.

redgremlin ★★★★★ ()
Ответ на: комментарий от d_a

Благодарю) Эт не велосипед, это, простите за плохие слова, код авторов книги....

sudoLife ()
Ответ на: комментарий от d_a

вместо всего вашего велосипеда

Ну, во-первых, это не полный аналог, так как сообщения «в PATH есть/нет» type и не печатает. Во-вторых, написанный скрипт всегда гибче, можно расширить ещё на какое спец. действие, в конце концов можно и починить, чтобы на исполняемые файлы по абсолютному пути не писало, что они в PATH, а потом навернуть логику, проверяющую, что этот абсолютный путь и сам есть в PATH.

vodz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.