分页: 1 / 1

请教 shell script 变量中空格的问题

发表于 : 2012-08-20 7:50
Chanux
那个农历软件 lunar 的参数是要带空格的,比如:

代码: 全选

lunar 2012 08 10 09:00
而每次这么输一遍太麻烦,试过

代码: 全选

lunar $date
后面加参数是不行的。
于是写了这个小脚本:

代码: 全选

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Yoftd=$(date +%Y)    #Year of today
moftd=$(date +%m)
doftd=$(date +%d)
Hoftd=$(date +%H:%M)

thedate=("$Yoftd $moftd $doftd $Hoftd")
echo -e $thedate    #test var
lunartd=lunar $thedate
变量 thedate 中已经有空格,但是 lunar 在读取的时候只读了第一个空格前的那个 2012,无法执行。

在 cal 中用这个方法加入参数也出现同样问题,而直接在终端输

代码: 全选

cal 8 2012
也没问题。

请问该如何解决空格的问题?

或者有更好的写参数方法?求教。

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 9:20
mswwjick
你可以试着把双引号去掉或把空格变成逗号等,
我是菜鸟,只是猜测,

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 11:06
枫叶饭团

代码: 全选

lunar `date`

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 21:53
Chanux
枫叶饭团 写了:

代码: 全选

lunar `date`
还是不行啊,终端和脚本里都不行。
“行 9: 2012: 未找到命令“

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 21:56
枫叶饭团
date的输出和参数不一致么?改一下输出吧

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 22:01
Chanux
枫叶饭团 写了:date的输出和参数不一致么?改一下输出吧
能再详细点吗?只学过一个多月C++,不会啊。

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 22:05
枫叶饭团
我的意思是date输出和lunar要的参数不一样导致运行失败还是别的,如果是输出不一致,man date

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-20 22:18
cuihao
因为变量解释成一个参数了吧。用eval解释一下就好了。

代码: 全选

cuihao@cuihao-arch ~ $ cal 8 2012
      八月 2012     
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

cuihao@cuihao-arch ~ $ cal '8 2012'
cal: illegal year value: use 1-9999: '8 2012'
cuihao@cuihao-arch ~ $ A='8 2012'
cuihao@cuihao-arch ~ $ cal $A
cal: illegal year value: use 1-9999: '8 2012'
cuihao@cuihao-arch ~ $ eval cal $A
      八月 2012     
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-21 0:02
funicorn
lunar `date +Y%` `date +%m` `date+%d`
Chanux 写了:那个农历软件 lunar 的参数是要带空格的,比如:

代码: 全选

lunar 2012 08 10 09:00
而每次这么输一遍太麻烦,试过

代码: 全选

lunar $date
后面加参数是不行的。
于是写了这个小脚本:

代码: 全选

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Yoftd=$(date +%Y)    #Year of today
moftd=$(date +%m)
doftd=$(date +%d)
Hoftd=$(date +%H:%M)

thedate=("$Yoftd $moftd $doftd $Hoftd")
echo -e $thedate    #test var
lunartd=lunar $thedate
变量 thedate 中已经有空格,但是 lunar 在读取的时候只读了第一个空格前的那个 2012,无法执行。

在 cal 中用这个方法加入参数也出现同样问题,而直接在终端输

代码: 全选

cal 8 2012
也没问题。

请问该如何解决空格的问题?

或者有更好的写参数方法?求教。

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-21 6:57
aerofox

代码: 全选

lunar $( date +"%Y %m %d %H:%M" )
cal $( date +"%m %Y" )

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-27 14:14
tusooa

代码: 全选

● bash -c 'foo="8 2012" ; cal $foo'
      八月 2012     
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
● bash -c 'foo="2012 8 27" ; lunar --utf8 $foo'
Lunar Version 2.2 (October 28, 2001)

阳历: 2012年 8月27日 0时 星期一
阴历: 2012年 7月11日子时 生肖属龙
干支: 壬辰年 戊申月 庚申日 丙子时 
用四柱神算推算之时辰八字: 壬辰年 戊申月 庚申日 丙子时
咋用咋正常。难道你用的Fish?印象里只有Fish才会自动把变量""起来.

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-27 14:16
tusooa
问题在

代码: 全选

lunartd=lunar $thedate

改成

代码: 全选

lunartd="$(lunar $thedate)"

Re: 请教 shell script 变量中空格的问题

发表于 : 2012-08-27 14:17
tusooa
cuihao 写了:因为变量解释成一个参数了吧。用eval解释一下就好了。

代码: 全选

cuihao@cuihao-arch ~ $ cal 8 2012
      八月 2012     
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

cuihao@cuihao-arch ~ $ cal '8 2012'
cal: illegal year value: use 1-9999: '8 2012'
cuihao@cuihao-arch ~ $ A='8 2012'
cuihao@cuihao-arch ~ $ cal $A
cal: illegal year value: use 1-9999: '8 2012'
cuihao@cuihao-arch ~ $ eval cal $A
      八月 2012     
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
● bash --version
GNU bash, 版本 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保.
可能是你的arch,bash太新了,新特性。