LinuxSir.cn,穿越时空的Linuxsir!

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

新手向各位问好,请教一个比较菜的问题

[复制链接]
发表于 2007-4-12 16:04:02 | 显示全部楼层 |阅读模式
有两个问题请教:
1、如何通过shell获取一个文件中的内容,并把它转化为变量。
   比如 文件名为abc
            文件内容为
                  beijing          111111111
                           shanghai      222222222
                           tianjin           333333333
                           ......               。。。。。。
                           wuhan          nnnnnnnn
           想把每一行中的城市名赋值为变量处理。
2、输入两个变量时间,然后shell会显示出这两个时间段的时间
    比如:输入 20060301 20060305
               输出 20060301
                       20060302
                       20060303
                       20060304
                       20060305
请各位高人指教。
 楼主| 发表于 2007-4-12 16:05:59 | 显示全部楼层
第2个问题补充:
如果输入 20060227 20060305
输出
20060227
20060228
20060301
20060302
20060303
20060304
20060305
回复 支持 反对

使用道具 举报

发表于 2007-4-12 20:12:18 | 显示全部楼层
问题1
根据你提供的abc文件的格式,暂时想到一个办法。就是将abc文件中每一行的空格给替换成等号,然后source这个文件。(只是个小聪明而已)
  1. #!/bin/bash
  2. Tempfile="/tmp/tempfile$$"
  3. Usage() {
  4.         echo "Usage: `basename $0` abc"
  5.         exit 1
  6. }
  7. if (( $#!=1 )) || [ ! -f $1 ]
  8. then
  9.         Usage
  10. fi
  11. sed 's/\ /=/g' $1 > ${Tempfile}
  12. source ${Tempfile}
  13. rm ${Tempfile} -f
  14. echo $beijing         #测试
  15. exit 0
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-13 01:11:23 | 显示全部楼层
  1. 1.
  2. while read var val; do
  3.     export $var=\'$val\'
  4. done < abc
复制代码
  1. 2. 一个思路:
  2. year1=${1:0:4}
  3. month1=${1:4:2}
  4. day1=${1:6}
  5. year2=${2:0:4}
  6. month2=${2:4:2}
  7. day2=${2:6}
  8. while [ $year1 -lt $year2 ] && [ $month1 -lt $month2 ] && [ $day1 -lt $day2 ]
  9. do
  10.     echo $year1$month1$day1
  11.     if $day1 is the last day of the month $month1
  12.         $day1=1;
  13.         if [ $month1 -eq 12 ]; then
  14.             $year1=$(( $year1 + 1))
  15.             $month1=1
  16.         else
  17.             $month=$(( $month1 + 1 ))
  18.         fi
  19.     else
  20.         $day1=$(( $day1 + 1 ))
  21.     fi
  22. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-13 09:03:29 | 显示全部楼层
biinn的思路是正确的,不过少考虑了闰年的情况,把闰年这个情况加上去就对了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-13 09:05:54 | 显示全部楼层
非常感谢adamzyg&biinn,我先测试一下
回复 支持 反对

使用道具 举报

发表于 2007-4-13 09:20:23 | 显示全部楼层
不过这种方法太复杂了,参考下面代码
  1. #!/bin/bash
  2. now=$(date +%Y%m%d)
  3. from=$1
  4. to=$2
  5. date --set="$1" > /dev/null
  6. while [ "$from" != "$to" ];do
  7.         echo $from
  8.         date --set="tomorrow" > /dev/null
  9.         from=$(date +%Y%m%d)
  10. done
  11. echo $from
  12. date --set="$now" > /dev/null
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-4-13 10:33:33 | 显示全部楼层
Post by Iambitious
不过这种方法太复杂了,参考下面代码

  1. #!/bin/bash

  2. now=$(date +%Y%m%d)
  3. from=$1
  4. to=$2

  5. date --set="$1" > /dev/null

  6. while [ "$from" != "$to" ];do
  7.         echo $from
  8.         date --set="tomorrow" > /dev/null
  9.         from=$(date +%Y%m%d)
  10. done
  11. echo $from
  12. date --set="$now" > /dev/null

复制代码

思路不错!
不过这个改了系统时间吧?实际应用恐怕有问题。
回复 支持 反对

使用道具 举报

发表于 2007-4-13 10:34:40 | 显示全部楼层
Post by Iambitious
biinn的思路是正确的,不过少考虑了闰年的情况,把闰年这个情况加上去就对了。

谢谢提交这个闰年bug,哈哈。
回复 支持 反对

使用道具 举报

发表于 2007-4-13 10:34:52 | 显示全部楼层
恩,虽然最后还原了系统时间,不过在执行的时候系统时间是不正确的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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