LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2057|回复: 25

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

[复制链接]
发表于 2005-5-3 12:40:07 | 显示全部楼层 |阅读模式
请问如下形式的调用:
  1. $ LANG=en_US konqueror %u
复制代码

里,位置变量为什么只是 $0=konqueror,$1=%u,而没有 LANG=en_US 呢?只能通过环境变量访问它吗?
发表于 2005-5-3 14:05:53 | 显示全部楼层
这样做的目的是?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 14:28:04 | 显示全部楼层
我想写一个 shell 程序来实现环境变量的优先级。比如,优先级像下面这样按照从低到高的顺序排列:
1) /etc/file1
2) /etc/file2
3) 由用户指定的环境变量
于是我想到了这个问题。顺便问一下,除了手工实现,有什么现成的库吗?不能是 Perl 或 Python 这种解释器,必须是 shell 的。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 14:44:09 | 显示全部楼层
shell有库吗?我还是第一次听说

兄弟是写C或C++程序的吧?
PS:还是没看懂,要实现这个优先级用“$ LANG=en_US konqueror %u”有什么联系?能再说得清楚一点吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 15:04:53 | 显示全部楼层
我正在尝试写一个与发行版无关的软件包管理工具。设计这个工具时,我参考了 Gentoo 和 Slackware 的包管理工具的特性,最重要的是我希望这个工具依赖最少的程序。于是,我尽量使用了 POSIX shell、C 和可能不太好的 shell 数组。现在我遇到的问题是这样的:您知道 Gentoo 里环境变量是具有优先级的。比如说,如果用户运行这个命令:
  1. ACCEPT_KEYWORDS="~x86" emerge kde
复制代码

ACCEPTS_KEYWORDS 的值就会覆盖 /etc/make.profile/make.defaults (好像是这个文件) 中的值。同时,许多配置文件如 /etc/portage/package.use 和 /etc/make.defaults 中相同名称的环境变量也具有不同的优先级。我希望用 shell 实现这个功能。
回复 支持 反对

使用道具 举报

发表于 2005-5-3 17:07:03 | 显示全部楼层
eval
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 17:29:36 | 显示全部楼层
比如说,我执行
  1. $ VAR1=abc x
复制代码

这样,在执行 x 的环境里,VAR1 就被指定为 abc 了。我想让一个命令就可以完成功能,所以我要在 x 的脚本里写上下面这样的命令:
  1. source /etc/file1
复制代码

可是这样一来,如果 /etc/file1 里也有 VAR1,就会将先前在命令行里指定的 VAR1 的值覆盖。有没有什么办法可以使 VAR1 的值不被覆盖呢?
回复 支持 反对

使用道具 举报

发表于 2005-5-3 20:00:54 | 显示全部楼层
Post by herberteuler
比如说,我执行
  1. $ VAR1=abc x
复制代码

这样,在执行 x 的环境里,VAR1 就被指定为 abc 了。我想让一个命令就可以完成功能,所以我要在 x 的脚本里写上下面这样的命令:
  1. source /etc/file1
复制代码

可是这样一来,如果 /etc/file1 里也有 VAR1,就会将先前在命令行里指定的 VAR1 的值覆盖。有没有什么办法可以使 VAR1 的值不被覆盖呢?


我想你用过变量PATH的
想想为什么PATH设置得了这么多的值?
如果我们要加一个PATH值会怎么做?
会这样做:
PATH=$PATH:NEWPATH
这样就把原来的值放在前面了,后面的NEWPATH值加到后面了

你希望的效果是这样吗?希望我没有理解错误
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

发表于 2005-5-3 21:24:22 | 显示全部楼层
Post by herberteuler
差欢啵还褂辛硗獾目赡埽褪峭耆谋湟桓鲋刀皇亲芳印R残碇挥?shell 惟一的方法就是将
  1. VAR1=default
复制代码

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

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


呵呵,你一定是没有想起shell里的这个功能了:
${var:=string}

在这里有详细的介绍:
http://www.linuxsir.cn/bbs/showthread.php?t=180140
回复 支持 反对

使用道具 举报

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

本版积分规则

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