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

sh/bash/dash/ksh/zsh等Shell脚本
回复
Chanux
帖子: 45
注册时间: 2011-03-23 19:40

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

#1

帖子 Chanux » 2012-08-20 7:50

那个农历软件 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
也没问题。

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

或者有更好的写参数方法?求教。
头像
mswwjick
帖子: 645
注册时间: 2009-01-28 21:42

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

#2

帖子 mswwjick » 2012-08-20 9:20

你可以试着把双引号去掉或把空格变成逗号等,
我是菜鸟,只是猜测,
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

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

#3

帖子 枫叶饭团 » 2012-08-20 11:06

代码: 全选

lunar `date`
Chanux
帖子: 45
注册时间: 2011-03-23 19:40

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

#4

帖子 Chanux » 2012-08-20 21:53

枫叶饭团 写了:

代码: 全选

lunar `date`
还是不行啊,终端和脚本里都不行。
“行 9: 2012: 未找到命令“
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

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

#5

帖子 枫叶饭团 » 2012-08-20 21:56

date的输出和参数不一致么?改一下输出吧
Chanux
帖子: 45
注册时间: 2011-03-23 19:40

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

#6

帖子 Chanux » 2012-08-20 22:01

枫叶饭团 写了:date的输出和参数不一致么?改一下输出吧
能再详细点吗?只学过一个多月C++,不会啊。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

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

#7

帖子 枫叶饭团 » 2012-08-20 22:05

我的意思是date输出和lunar要的参数不一样导致运行失败还是别的,如果是输出不一致,man date
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
联系:

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

#8

帖子 cuihao » 2012-08-20 22:18

因为变量解释成一个参数了吧。用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
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
funicorn
帖子: 1318
注册时间: 2005-09-13 4:56
系统: Ubuntu Jammy Jellyfi

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

#9

帖子 funicorn » 2012-08-21 0:02

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
也没问题。

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

或者有更好的写参数方法?求教。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#10

帖子 aerofox » 2012-08-21 6:57

代码: 全选

lunar $( date +"%Y %m %d %H:%M" )
cal $( date +"%m %Y" )
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#11

帖子 tusooa » 2012-08-27 14:14

代码: 全选

● 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才会自动把变量""起来.

代码: 全选

] ls -ld //
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#12

帖子 tusooa » 2012-08-27 14:16

问题在

代码: 全选

lunartd=lunar $thedate

改成

代码: 全选

lunartd="$(lunar $thedate)"

代码: 全选

] ls -ld //
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#13

帖子 tusooa » 2012-08-27 14:17

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太新了,新特性。

代码: 全选

] ls -ld //
回复