$?проблема со сценарием tcsh - PullRequest
       77

$?проблема со сценарием tcsh

0 голосов
/ 07 февраля 2019

Я запутался с проблемой сценария оболочки tcsh.(для работы, нет выбора в оболочке, я застрял с ней)

Элементы enableThingN ниже - это переменные среды оболочки, устанавливаемые другими вещами перед запуском этого сценария csh с использованием оболочки tcsh.Они вообще не устанавливаются в одном и том же сценарии, только оцениваются здесь.

Сообщение об ошибке:

enableThing1: Undefined variable.

Код:

if ( ( $?enableThing1  &&  ($enableThing1 == 1) ) || \
     ( $?enableThing2  &&  ($enableThing2 == 1) ) || \
     ( $?enableThing3  &&  ($enableThing3 == 1) ) || \
     ( $?enableThing4  &&  ($enableThing4 == 1) )      ) then

    set someScriptVar  = FALSE
else
    set someScriptVar  = TRUE
endif

Итак, какЯ понимаю вещи, первая часть большого условия if - проверить, определен ли enableThing1 или нет, используя магию $? EnableThing1.Если оно определено, то перейдите и проверьте значение 1 или что-то еще.Если он не определен, пропустите часть проверки == 1 для той же переменной оболочки и перейдите к определению enableThing2 или нет, и т. Д.

Похоже, япроверка на существование и намерение избежать проверки значения, если оно вообще не определено, где я ошибся?

Я искал здесь на stackoverflow и в Google в целом, но результатов мало и нетполучить ответ, например:

https://stackoverflow.com/questions/16975968/what-does-var-mean-in-csh

1 Ответ

0 голосов
/ 07 февраля 2019

Оператор if для проверки значения переменной требует, чтобы переменная существовала.

if ( ( $?enableThing1  &&  ($enableThing1 == 1) ) || \
#                             ^ this will fail if the variable is not defined.

Таким образом, условие if превращается в

if ( ( 0  &&  don'tknowaboutthis ) || \

и не имеет значения.

Предполагая, что вы не хотите, чтобы лестница if и функциональность добавлялись в этот список переменных для проверки, вы можете попробовать следующее решение:

#!/bin/csh -f

set enableThings = ( enableThing1 enableThing2 enableThing3 enableThing4 ... )

# setting to false initially
set someScriptVar = FALSE

foreach enableThing ($enableThings)

# since we can't use $'s in $? we'll have to do something like this.
  set testEnableThing = `env | grep $enableThing`

# this part is for checking if it exists or not, and if it's enabled or not
  if (($testEnableThing != "") && (`echo $testEnableThing | cut -d= -f2` == 1 )) then
     #  ^ this is to check if the variable is defined       ^ this is to take the part after the =
#                                                             d stands for delimiter
# for example, the output of testEnableThing, if it exists, would be enableThing1=1
# then we take that and cut it to get the value of the variable, in our example it's 1

# if it exists and is enabled, set your someScriptVar
    set someScriptVar = TRUE
# you can put a break here since it's irrelevant to check 
# for other variables after this becomes true
    break
  endif
end

Это работает, потому что мы работаем толькос одной переменной, «testEnableThing», которая всегда определяется в зависимости от того, как это работает.Это может быть пустая строка, но она будет определена таким образом, чтобы наш оператор if не сработал.

Надеюсь, это решит ее за вас.

...