Оператор 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 не сработал.
Надеюсь, это решит ее за вас.