通过命令行选项覆盖用户定义的 variable/environment 变量

Overriding an user defined variable/environment variable through command line option

正在寻找从命令行覆盖 c-shell 变量的方法。在下面的脚本 (test.csh) 中,FOO 的默认值将为 0。我应该 "optionally" 能够从命令行覆盖 FOO 的值。

#!/bin/csh

setenv FOO 0
if (${FOO}) then
    echo "Hello"
else
    echo "World"
endif

查看 csh/tcsh 的手册页表明有一个 -Dvariable[=value] 可以做到这一点。所以我在命令行上尝试了下面的命令,并认为它会打印 "Hello"。相反,它打印了 "World" - 这意味着 -DFOO=1 没有生效。

unix-prompt> ./test.csh -DFOO=1

我不想使用#argv 东西,然后解析 args 并根据 args 适当地设置环境变量。我没有强制使用 setenv。

期望使用命令行覆盖来覆盖 c-shell 中使用的默认值。

-D 选项在 tcsh(1) 中记录为:

   -Dname[=value]
       Sets the environment variable name to value. (Domain/OS only) (+)

我猜你不是 运行 Domain/OS :-)

您可以使用env为一个命令设置一个变量,例如:

$ env FOO=1 ./a.csh

请注意,在您的脚本中,您总是将 FOO 覆盖为 0;所以你需要修改它以在它未设置时覆盖它:

if (! $?FOO) setenv FOO 0

作为后记,我应该指出,如果可以避免的话,通常不鼓励在 csh 中编写脚本;有很多注意事项和缺点(参见 this),使用 Bourne shell.

几乎总是更好