$ @ запутался - PullRequest
       3

$ @ запутался

1 голос
/ 17 июня 2011

Я пытаюсь написать скрипт bash, который проверит первый аргумент, и если он имеет одно из определенных значений, он удалит этот аргумент из аргументов и настроит некоторые вещи:

#!/bin/bash -x

echo args=$@

if [ "$1" == "valgrind" ]; then
    echo running under valgrind
    set $tool=valgrind
    shift 1
elif [ "$1" == "debug" ]; then
    echo running under gdb
    set $tool=gdb --args
    shift 1
else
    echo running normally
    set $tool=""
fi

echo tool=$tool
echo args=$@

Однако, Когда я запускаю это, он потребляет все аргументы!Например:

./my_script valgrind --something=y -r

+ echo args=valgrind --something=y -r
args=valgrind --something=y -r
+ '[' valgrind == valgrind ']'
+ echo running under valgrind
running under valgrind
+ set =valgrind
+ shift 1
+ echo tool=
tool=
+ echo args=
args=

и если операторы if не соблюдаются:

./my_script valgrindx --something=y -r

+ echo args=valgrindx --something=y -r
args=valgrindx --something=y -r
+ '[' valgrindx == valgrind ']'
+ '[' valgrindx == debug ']'
+ echo running normally
running normally
+ set =
+ echo tool=
tool=
+ echo args==
args==

Что происходит и как это исправить?

Ответы [ 4 ]

4 голосов
/ 17 июня 2011

Это потому, что set blah blah blah на самом деле устанавливает параметры $1 ... $N равными значениям аргументов, как показано в следующей записи:

pax$ echo $1

pax$ set $tool=hello ; echo $1
=hello

pax$ tool=xyzzy ; set $tool=hello ; echo $1
xyzzy=hello

(во второй команде $tool не задано, поэтому оно отображается пустым).

В вашем случае set $tool=valgrind устанавливает $1 на значение, которое вычисляет $tool=valgrind, поэтому $@ меняется. не устанавливает переменную окружения tool в valgrind.

Если вы хотите установить переменную, просто используйте:

tool=valgrind

или, чтобы сделать его доступным для подоболочек:

export tool=valgrind

Команда set используется для отображения содержимого среды или установки атрибутов и аргументов оболочки, а не именованных переменных. Если вы заглянете на справочную страницу man bash_builtins, вы увидите бит, объясняющий это поведение (найдите описание set):

Любые аргументы, оставшиеся после обработки параметров, обрабатываются как значения для позиционных параметров и присваиваются по порядку $1, $2, ... $n.

2 голосов
/ 17 июня 2011
set $tool=valgrind

должно быть

tool=valgrind

Команда set предназначена для чего-то другого в bash, попробуйте 'help set'.

0 голосов
/ 17 июня 2011

Вам также следует проверить getopts для обработки -x argument. Смотрите здесь

0 голосов
/ 17 июня 2011

set $tool=valgrind должно быть просто tool=valgrind.* В оболочке, совместимой с Bash / Bourne, set отличается от используемой в оболочке C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...