Chinaunix

标题: 怎样将字符串变成数值(已解决) [打印本页]

作者: chilewh    时间: 2009-03-03 15:07
标题: 怎样将字符串变成数值(已解决)
将bw="1024"转换成bw=1024,应该怎样做?

我是新手,请指教!

[ 本帖最后由 chilewh 于 2009-3-4 10:10 编辑 ]
作者: 我是DBA    时间: 2009-03-03 15:08
字符串通过计算就能变成数字
作者: HH106    时间: 2009-03-03 15:12
shell里的变量不分类型的
作者: chilewh    时间: 2009-03-03 15:18
实际上是这样的,配置文件/root/test/s.conf
# TAG: bandwidth
bandwidth  600



#获取bandwidth的值
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)

#为tc流量控制的命令,建立tbf队列
tc qdisc add dev eth0 parent 211:1 handle 2111:0 tbf rate ${v_bw} kbit buffer 1600 limit 3000
到这就出错了。提示为:
Illegal "rate"

所以我猜测tc命令中的是不是需要的是数值呢?
作者: 飞鸿无痕    时间: 2009-03-03 15:27
标题: 回复 #4 chilewh 的帖子
在tc qdisc add dev eth0 parent 211:1 handle 2111:0 tbf rate ${v_bw} kbit buffer 1600 limit 3000前面添加个echo ${v_bw}看下,能不能得到你想要的值!
作者: 我是DBA    时间: 2009-03-03 15:27
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
这个超作完,你echo一下值出来看看,有没有字符之类的
作者: chilewh    时间: 2009-03-03 15:29
能得到600
作者: HH106    时间: 2009-03-03 15:31
原帖由 chilewh 于 2009-3-3 15:18 发表
实际上是这样的,配置文件/root/test/s.conf
# TAG: bandwidth
bandwidth  600



#获取bandwidth的值
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)

#为tc流量控制的命令,建立t ...

估计是v_bw的值前面还有空格什么的
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf|tr -d " ")
或v_bw=$(awk '/^bandwidth/{print $2}' /root/test/s.conf )
作者: chilewh    时间: 2009-03-03 15:36
标题: 回复 #8 HH106 的帖子
我用你说的实验了一下,还是不行

还是提示:Illegal "rate"
作者: 我是DBA    时间: 2009-03-03 15:43
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
v_bw=$((v_bw+0))
作者: chilewh    时间: 2009-03-03 15:53
标题: 回复 #10 我是DBA 的帖子
v_bw=$((v_bw+0))
这句话是什么意思呀?
我这提示出:
-bash: 500
500
600
600
600
600
")syntax error: operand expected (error token is "
作者: chilewh    时间: 2009-03-03 15:58
我在网上找到这样一句话:

“shell变量默认情况下,它是作为保存字符串的。即使它被赋予数值也是保存为字符串”
作者: 我是DBA    时间: 2009-03-03 15:59
标题: 回复 #12 chilewh 的帖子
那说明你取到的值不是唯一值
作者: chilewh    时间: 2009-03-03 16:03
现在改过来了

但是第二句提示如下:
")syntax error: operand expected (error token is "
作者: seeLnd    时间: 2009-03-03 16:26
你这个问题应该不是什么“字符串”,”数字“ 的问题,
一个程序被exec,参数都是字符串,在c中都是 char **argv类型,
你试试直接执行,不要用变量:  tc  ... ... ...  rate 600 ... ...   如果还有错,说明rate后面的参数给的不符合要求,
如果没有错,那可能就是你的$v_bw中有特殊字符
作者: chilewh    时间: 2009-03-03 16:39
直接执行 tc  ... ... ...  rate 600 ... ...   没有出问题

又尝试了“v_bw的值前面还有空格什么的”这个建议
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf|tr -d " ")

echo $v_bw
输出600

请问$v_bw中还能有其他什么特殊字符

为什么有的变量定义是d="eth0"  rate=1000
这两个是不同的吧!我想我的问题就是这两个转换的问题
作者: seeLnd    时间: 2009-03-03 16:43
那你就这样:
test=600
test2="600"

tc ......  rate $test  ....
tc ......  rate $test2  ....

这两条命令如果都能成功,那么肯定你的 $v_bw 有些啥特殊的了

echo -n "$v_bw" | cat -A  能看到$v_bw里有些啥

[ 本帖最后由 seeLnd 于 2009-3-3 16:45 编辑 ]
作者: chilewh    时间: 2009-03-03 16:53
产生了一个问题
配置文件/root/test/s.conf
# TAG: bandwidth
bandwidth  600



#获取bandwidth的值
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
(( v_bw=$ v_bw+ 1 ))
echo $v_bw
result:600

我的结果怎么是600,没变呀?
作者: 我是DBA    时间: 2009-03-03 16:54
原帖由 chilewh 于 2009-3-3 16:53 发表
产生了一个问题
配置文件/root/test/s.conf
# TAG: bandwidth
bandwidth  600



#获取bandwidth的值
v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
(( v_bw=$ v_bw+ 1 ))
echo $ ...

(( v_bw=$ v_bw+ 1 ))
作者: chilewh    时间: 2009-03-03 16:55
用rate="600"时,产生错误:
Illegal "rate"

请你们帮帮忙啦!
作者: seeLnd    时间: 2009-03-03 17:00
呵呵,是么 test="600" 会出错?
那再试试吧:  declare -i v_bw=$(sed ....)
作者: chilewh    时间: 2009-03-03 17:05
标题: 回复 #19 我是DBA 的帖子
如果v_bw取出的是数值的话
(( v_bw=$ v_bw+ 1 ))
结果不是应该增加1吗?
变为601
作者: 我是DBA    时间: 2009-03-03 17:07
标题: 回复 #22 chilewh 的帖子
(( v_bw=$v_bw+ 1 ))

你的$与v_bw多了空格
作者: chilewh    时间: 2009-03-03 17:10
标题: 回复 #21 seeLnd 的帖子
[root@localhost ~]# declare -i v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
提示:
")syntax error: operand expected (error token is "

请问这个declare -i v_bw=$(sed ....)是什么意思呀?
作者: seeLnd    时间: 2009-03-03 17:24
声明 变量为 integer,  你的shell是bash吗,如果是,版本是多少
作者: chilewh    时间: 2009-03-03 17:37
标题: 回复 #25 seeLnd 的帖子
GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

非常遗憾,我的还是600
v_b=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf|tr -d " ")
[root@localhost ~]# (( v_b=$v_b+ 1 ))
[root@localhost ~]# echo $v_b
600
作者: waker    时间: 2009-03-03 17:44
file root/test/s.conf
cat -A root/test/s.conf
dos2unix root/test/s.conf
作者: kwokcn    时间: 2009-03-03 17:46
用let试试呢?

let v_b=v_b+1

我这里都没问题。


  1. [root@bj_manager test]# v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /home/gh/test/s.conf)
  2. [root@bj_manager test]# echo $v_bw
  3. 600
  4. [root@bj_manager test]# let v_bw=v_bw+1
  5. [root@bj_manager test]# echo $v_bw     
  6. 601
  7. [root@bj_manager test]# v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /home/gh/test/s.conf)
  8. [root@bj_manager test]# echo $v_bw
  9. 600
  10. [root@bj_manager test]# (( v_bw=v_bw+1 ))
  11. [root@bj_manager test]# echo $v_bw
  12. 601
  13. [root@bj_manager test]#
复制代码

[ 本帖最后由 kwokcn 于 2009-3-3 17:50 编辑 ]
作者: seeLnd    时间: 2009-03-03 17:49
我还是觉得你的 v_bw 中有特殊的东西,你确信试过了吗:

echo -n "$v_bw"  | cat -A  ,看看有何东西在里面
作者: kwokcn    时间: 2009-03-03 17:55
原帖由 chilewh 于 2009-3-3 17:10 发表
[root@localhost ~]# declare -i v_bw=$(sed -n '/^bandwidth/s/bandwidth //p' /root/test/s.conf)
提示:
")syntax error: operand expected (error token is "

请问这个declare -i v_bw=$(sed ....)是什 ...

waker的答复应该是正确的。
应该是后面多了^M。
作者: 我是DBA    时间: 2009-03-03 19:54
标题: 回复 #26 chilewh 的帖子
你的文件有问题
作者: chilewh    时间: 2009-03-04 10:09
找到原因了
确实是多了^M

谢谢大家的帮忙!
作者: yingweixu    时间: 2009-03-04 10:22
学习~~
作者: towel    时间: 2009-03-05 17:56
这个问题告诉我们,如果你想在LINUX下工作的话,就把那些NOTEPAD,WORD等windows的文本编辑器抛开,用vi或emacs吧。实在不行的话,用dos2unix转换一下。
作者: 故哈    时间: 2009-03-07 19:02
看来CU 都是这种初级选手 每当这种初级问题出现时候 总是很多人抢着回答




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2