LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: herberteuler

环境变量不作为位置变量吗?

[复制链接]
发表于 2005-5-3 22:36:11 | 显示全部楼层
Post by herberteuler
差不多,不过还有另外的可能,就是完全改变一个值而不是追加。也许只用 shell 惟一的方法就是将
  1. VAR1=default
复制代码

这样的配置文件先转换成
  1. if test -z VAR1 ; then
  2.     VAR1=default
  3. fi
复制代码

这样的形式,并作为一个临时文件存在,然后 source 这个临时文件了。谢谢 kiron。


export a=1 && echo a
这样行不?如果你有很多环境变量设置,就直接下如文件,然后在你的主程序中source它。如:
#!/bin/bash

. mysource.file

...blabla
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 22:46:25 | 显示全部楼层
Post by kiron
呵呵,你一定是没有想起shell里的这个功能了:
${var:=string}

在这里有详细的介绍:
http://www.linuxsir.cn/bbs/showthread.php?t=180140


可是,我的配置文件是给用户写的,对于用户来说,写成
  1. ${var:=string}=something
复制代码

远不如
  1. var = string
复制代码

何况,几乎所有的配置文件都是后者的形式。谢谢您。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 22:51:57 | 显示全部楼层
Post by yongjian
export a=1 && echo a
这样行不?如果你有很多环境变量设置,就直接下如文件,然后在你的主程序中source它。如:
#!/bin/bash

. mysource.file

...blabla

这个和我的想法还有些出入。我想的是(Gentoo 里也是这样),在用户没有指定一个变量的情况下,使用默认的变量;如果用户指定了一个变量,就使用由用户指定的值。例如,系统的配置文件里有一行
  1. VAR=path1
复制代码

用户指定的配置文件里有一行
  1. VAR=path2
复制代码

在这种情况下,优先使用用户指定的值;但是,如果用户这样执行命令:
  1. VAR=path3 command
复制代码

则使用 path3 而不是 path2 或者 path1。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:21:01 | 显示全部楼层
Post by herberteuler
这个和我的想法还有些出入。我想的是(Gentoo 里也是这样),在用户没有指定一个变量的情况下,使用默认的变量;如果用户指定了一个变量,就使用由用户指定的值。例如,系统的配置文件里有一行
  1. VAR=path1
复制代码

用户指定的配置文件里有一行
  1. VAR=path2
复制代码

上面就这样写就成了,先读系统的配置文件,此时VAR值为path1,再读用户配置文件,执行 VAR=path2,则VAR=path2,是不是用户的值优先了?而如果用户配置中没有VAR=path2这句,则VAR仍然是等于path1的。
Post by herberteuler

在这种情况下,优先使用用户指定的值;但是,如果用户这样执行命令:
  1. VAR=path3 command
复制代码

则使用 path3 而不是 path2 或者 path1。

这个怕是和你的程序实现有关的吧,另外我觉得比较奇怪,为何把VAR=path3 放在前面而不是把命令名放在前面,一般来说应该是command VAR=path3比较传统的做法
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:22:36 | 显示全部楼层
Post by herberteuler
这个和我的想法还有些出入。我想的是(Gentoo 里也是这样),在用户没有指定一个变量的情况下,使用默认的变量;如果用户指定了一个变量,就使用由用户指定的值。例如,系统的配置文件里有一行
  1. VAR=path1
复制代码

用户指定的配置文件里有一行
  1. VAR=path2
复制代码

在这种情况下,优先使用用户指定的值;但是,如果用户这样执行命令:
  1. VAR=path3 command
复制代码

则使用 path3 而不是 path2 或者 path1。


哦是这样, 那这样试试:

  1. export VAR=path3 && command
复制代码

然后在command里:

  1. #!/bin/sh
  2. echo ${VAR:='abc'}
  3. ...blabla
复制代码

这样,如果用户没有export变量,则用abc,如果有则用用户指定的。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:28:06 | 显示全部楼层
Post by kiron
上面就这样写就成了,先读系统的配置文件,此时VAR值为path1,再读用户配置文件,执行 VAR=path2,则VAR=path2,是不是用户的值优先了?而如果用户配置中没有VAR=path2这句,则VAR仍然是等于path1的。

这个怕是和你的程序实现有关的吧,另外我觉得比较奇怪,为何把VAR=path3 放在前面而不是把命令名放在前面,一般来说应该是command VAR=path3比较传统的做法



这是在Gentoo里比较典型的选择C编译参数的方法(但不是gentoo的专利)。make可以将用户指定的编译参数pass给compiler。一般在Makefile中有CFLAG的缺省值,但根据不同平台,用户可以指定编译参数。意思和export VAR=1 && command 一个意思。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 23:42:20 | 显示全部楼层
Post by yongjian
哦是这样, 那这样试试:

  1. export VAR=path3 && command
复制代码

然后在command里:

  1. #!/bin/sh
  2. echo ${VAR:='abc'}
  3. ...blabla
复制代码

这样,如果用户没有export变量,则用abc,如果有则用用户指定的。

谢谢您。

可是,对于我的程序来说,VAR 这个值不是在我的程序文件里指明的,而是在配置文件里指明的。所以,要取得它的值,我不得不用 source 或 . 这个命令。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 23:49:10 | 显示全部楼层
Post by kiron
上面就这样写就成了,先读系统的配置文件,此时VAR值为path1,再读用户配置文件,执行 VAR=path2,则VAR=path2,是不是用户的值优先了?而如果用户配置中没有VAR=path2这句,则VAR仍然是等于path1的。

这个怕是和你的程序实现有关的吧,另外我觉得比较奇怪,为何把VAR=path3 放在前面而不是把命令名放在前面,一般来说应该是command VAR=path3比较传统的做法

下面的内容来自 The UNIX Programming Environment by Brian W. Kernighan and Rob Pike:
在子 shell 里设置变量值的另一个方法,是在一个命令行之前显示地给它赋值:
  1. $ echo 'echo $x' >echox
  2. $ cx echox
  3. $ echo $x
  4. Hello                      和以前一样
  5. $ echox
  6.                           x 不在子 shell 里
  7. $ x=Hi echox
  8. Hi                        x 被传给了子 shell
  9. $
复制代码

(原来在命令行里的任意地方赋值都会被传递给该命令,不过这样与 dd(1) 命令不符合。)
…… ……
  1. $ ls /usr/games | grep fort
  2. fortune
  3. $ fortune          Fortune cookie 命令
  4. fortune: not found
  5. $ echo $PATH
  6. :/usr/you/bin:/bin:/usr/bin             /usr/games 不在 PATH 中
  7. $ PATH=/usr/games fortune
  8. Ring the bell; close the book; quench the candle.
  9. $ echo $PATH
  10. :/usr/you/bin:/bin:/usr/bin              PATH 没有被改变
  11. $ cat /usr/you/bin/games
  12. PATH=$PATH:/usr/games
  13. $ . games                                        games 命令仍然存在
  14. $ fourtune
  15. Premature optimization is the root of all evil - Knuth
  16. echo $PATH
  17. :/usr/you/bin:/bin:/usr/bin:/usr/games     这次 PATH 被改变了
  18. $
复制代码

下面是我的内容了
  1. $ cat x
  2. #!/bin/sh

  3. echo $*
  4. $ LANG=en_US ./x

  5. $ ./x LANG=en_US
  6. LANG=en_US
  7. $
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:50:47 | 显示全部楼层
Post by herberteuler
谢谢您。

可是,对于我的程序来说,VAR 这个值不是在我的程序文件里指明的,而是在配置文件里指明的。所以,要取得它的值,我不得不用 source 或 . 这个命令。


那就不行了, 我以为环境变量已经在用户环境中配置好了呢。如果你在程序中source一遍的话,export的值会被覆盖。我看只有做成interactive的程序了,就是提问用户。不过就烦人很多了。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 23:51:22 | 显示全部楼层
Post by yongjian
这是在Gentoo里比较典型的选择C编译参数的方法(但不是gentoo的专利)。make可以将用户指定的编译参数pass给compiler。一般在Makefile中有CFLAG的缺省值,但根据不同平台,用户可以指定编译参数。意思和export VAR=1 && command 一个意思。

谢谢!
这个用法我没看过,长见识了

to  herberteuler:
你讲的很明白,谢谢,
我也看过这本书,怎么就好像不认识这种用法 :p
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表