LinuxSir.cn,穿越时空的Linuxsir!

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

关于"变量截取"[基本解决]

[复制链接]
发表于 2004-3-31 17:07:53 | 显示全部楼层 |阅读模式
假定有一脚本为foo.sh,用户输入如下:
======================================
$foo.sh ~/worksapce/bash/ABC.sh
======================================
请问怎样在foo.sh中给如下两变量覆值: RES_DIR,RES_FILE
使其分别为
RES_DIR=~/worksapce/bash/
RES_FILE=ABC.sh
谢谢
发表于 2004-3-31 17:58:24 | 显示全部楼层

回复: 关于"变量截取"

最初由 bigml 发表
假定有一脚本为foo.sh,用户输入如下:
======================================
$foo.sh ~/worksapce/bash/ABC.sh
======================================
请问怎样在foo.sh中给如下两变量覆值: RES_DIR,RES_FILE
使其分别为
RES_DIR=~/worksapce/bash/
RES_FILE=ABC.sh
谢谢

RES_FILE=${1##*/}
RES_DIR=${1%/*}
发表于 2004-3-31 18:59:40 | 显示全部楼层
或用 dirname, basename
发表于 2004-3-31 19:05:58 | 显示全部楼层
最初由 dearvoid 发表
或用 dirname, basename

理论上看,这样做效率没这么好。
因为使用dirname或basename时,父shell会为这些命令创建新的子shell来执行,而字符串处理则是内置的,在父shell的进程内执行。当然,小型脚本无所谓效率了。
发表于 2004-3-31 19:16:34 | 显示全部楼层
在终端输入任何命令,当前shell都会fork()一个子shell来执行。上面说的两种方法都会创建一个子shell.那主要的区别就是哪个方法快了。
我的鉴别方法是分别让那两个进程连续运行50000次。
发表于 2004-3-31 21:38:45 | 显示全部楼层
最初由 devel 发表
在终端输入任何命令,当前shell都会fork()一个子shell来执行。上面说的两种方法都会创建一个子shell.那主要的区别就是哪个方法快了。
我的鉴别方法是分别让那两个进程连续运行50000次。

我们讨论的是脚本,不是从终端直接键入命令。
修正一下,${i}这样的字符串截取是不会创建新进程的。相比而言,调用dirname这样的命令就会创建额外的shell进程。
 楼主| 发表于 2004-4-1 08:30:03 | 显示全部楼层

回复: 回复: 关于"变量截取"

感謝 home_king和大家的踴躍發言,呵呵。

個人偏向於使用${}的形式,感覺這更象是SHELL腳本語言的語法,而dirname和basename更象是SHELL提供的API函數。(不知理解是否正確了^-^!)

昨天理解${}中的兩個*花了很大力氣。不理解的可以參考
http://www.sdn.or.id/share/LDP/a ... r-substitution.html
发表于 2004-4-1 08:50:09 | 显示全部楼层
跟 API 函数却是不同
发表于 2004-4-1 16:08:02 | 显示全部楼层

回复: 回复: 回复: 关于"变量截取"

最初由 bigml 发表
感謝 home_king和大家的踴躍發言,呵呵。

個人偏向於使用${}的形式,感覺這更象是SHELL腳本語言的語法,而dirname和basename更象是SHELL提供的API函數。(不知理解是否正確了^-^!)

昨天理解${}中的兩個*花了很大力氣。不理解的可以參考
http://www.sdn.or.id/share/LDP/a ... r-substitution.html

论坛里就有关于${}的简单实例,见:
http://www.linuxsir.cn/bbs/showthread.php?threadid=92866
 楼主| 发表于 2004-4-2 10:52:05 | 显示全部楼层

TKS

已收藏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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