Chinaunix

标题: shell编程问题,在线等 [打印本页]

作者: linux飞翔    时间: 2008-04-24 15:26
标题: shell编程问题,在线等
脚本如下
#!/bin/bash
i=$(rsync  -avl --include "*/" --include "GameLog.ini" --exclude "*" /usr/richman/rich/gs1-game/ /usr/richman/GameLog | echo $?)
for $i=0
  do
   j=$(tar cvzf GameLog.tar.gz GameLog | echo $?)
        done
  for $j=0
    do
      rm -rf GameLog
       done
报错信息
./tar.sh: line 6: `$i=0': not a valid identifier
./tar.sh: line 10: `$j=0': not a valid identifier
大家帮我看下,我也就是想去查看上一命令是否执行完,如果是,就执行下个
作者: kenduest    时间: 2008-04-24 15:31
1. 這個問題在 linux 版系統篇來問似乎比較適合.

2. bash 內您的 for 語法使用錯誤。for 語法例子使用像是有:


  1. for i in 1 2 3 4 5
  2. do
  3.    echo $i
  4. done
复制代码


  1. for((i=0;i<10;i++))
  2. do
  3.     echo $i
  4. done
复制代码


--
作者: linux飞翔    时间: 2008-04-24 15:37
现在就简单点
#!/bin/bash
i=$(rsync  -avl --include "*/" --include "GameLog.ini" --exclude "*" /usr/richman/rich/gs1-game/ /usr/richman/GameLog | echo $?)
if $i=0
  then
   tar cvzf GameLog.tar.gz GameLog
  fi

报错信息./tar.sh: line 3: 0=0: command not found
作者: incle    时间: 2008-04-24 15:43
原帖由 linux飞翔 于 2008-4-24 15:37 发表
现在就简单点
#!/bin/bash
i=$(rsync  -avl --include "*/" --include "GameLog.ini" --exclude "*" /usr/richman/rich/gs1-game/ /usr/richman/GameLog | echo $?)
if $i=0
  then
   tar cvzf GameLog ...

if 后面的一般是:

if [$i = 0]
then ....
作者: kenduest    时间: 2008-04-24 15:45
原帖由 linux飞翔 于 2008-4-24 15:37 发表
现在就简单点
#!/bin/bash
i=$(rsync  -avl --include "*/" --include "GameLog.ini" --exclude "*" /usr/richman/rich/gs1-game/ /usr/richman/GameLog | echo $?)
if $i=0


剛剛是 for, 目前又來一個 if ?

建議這位大哥先去翻一下 bash 文件,先把基本的語法弄懂似乎比較好呢  

--
作者: incle    时间: 2008-04-24 15:47
试试这个更简单的, 解决问题的办法是尽量把范围缩小.


  1. #!/bin/bash
  2. i=0
  3. if [ $i=0 ]
  4.   then
  5.      echo $i
  6.   fi
复制代码

作者: linux飞翔    时间: 2008-04-24 15:48
楼上的老大,不是我说你,你水平很高吗,我现在求救,你说for不行,我就换if,按你说的还不行?
再说for也行
作者: linux飞翔    时间: 2008-04-24 15:49
标题: 回复 #6 incle 的帖子
不是你说的问题,if [ $i=0 ]
可以写成if $i=0的
再说你先定义完了,还要if干啥
作者: kenduest    时间: 2008-04-24 15:53
原帖由 linux飞翔 于 2008-4-24 15:48 发表
楼上的老大,不是我说你,你水平很高吗,我现在求救,你说for不行,我就换if,按你说的还不行?
再说for也行


這位朋友您似乎不大客氣哦.... 不都提供 for 正確用法嗎,再者這些東西不是應該先自己看一下 manpage or google 一下就知道答案呼?


  1. $help
  2. for: for NAME [in WORDS ... ;] do COMMANDS; done
  3.      The `for' loop executes a sequence of commands for each member in a
  4.     list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
  5.     assumed.  For each element in WORDS, NAME is set to that element, and
  6.     the COMMANDS are executed.
  7. for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
  8.      Equivalent to
  9.         (( EXP1 ))
  10.         while (( EXP2 )); do
  11.                 COMMANDS
  12.                 (( EXP3 ))
  13.         done
  14.     EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
  15.     omitted, it behaves as if it evaluates to 1.

复制代码


若您真的不大會用,請看一下基本教程也可以,比方 Bash Programming Intro HOWTO

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

--
作者: kenduest    时间: 2008-04-24 15:56
原帖由 linux飞翔 于 2008-4-24 15:49 发表
不是你说的问题,if [ $i=0 ]
可以写成if $i=0的
再说你先定义完了,还要if干啥


這位朋友您今天吃火藥了是嗎?

首先您這語法是錯誤的:

  1. if [ $i=0 ]
复制代码


正確語法應該是:

  1. if [ $i = 0 ]
复制代码


= 可以用 ==,另外數值比較可以寫成:

  1. if [ $i -eq 0 ]
复制代码


--
作者: linux飞翔    时间: 2008-04-24 15:57
标题: 回复 #9 kenduest 的帖子
要是知道google答案的话还来论坛发帖子啊,论坛不就是求救和讨论的地方,我错了...谢谢
作者: kenduest    时间: 2008-04-24 16:00
原帖由 linux飞翔 于 2008-4-24 15:57 发表
要是知道google答案的话还来论坛发帖子啊,论坛不就是求救和讨论的地方,我错了...谢谢


是,您是可以討論,不過基本的語法在手冊內與 google 都可以找到.

--
作者: incle    时间: 2008-04-24 16:05
原帖由 linux飞翔 于 2008-4-24 15:49 发表
不是你说的问题,if [ $i=0 ]
可以写成if $i=0的
再说你先定义完了,还要if干啥

我只是用个小例子, 因为我觉得问题就是那个括号的问题, 这样我就可以确认我的想法了.
你说可以写成 if $i = 0 说实话,我还真没有能成功过. 不管在 rehat, suse , 还是在 hp-uinx, soliaris, Aix 也都没成功哦.
作者: linux飞翔    时间: 2008-04-24 16:07
原帖由 incle 于 2008-4-24 16:05 发表

我只是用个小例子, 因为我觉得问题就是那个括号的问题, 这样我就可以确认我的想法了.
你说可以写成 if $i = 0 说实话,我还真没有能成功过. 不管在 rehat, suse , 还是在 hp-uinx, soliaris, Aix 也都没成功哦.

哥们,你说的对,不好意思
作者: incle    时间: 2008-04-24 16:12
原帖由 kenduest 于 2008-4-24 15:56 发表


這位朋友您今天吃火藥了是嗎?

首先您這語法是錯誤的:

if [ $i=0 ]

正確語法應該是:

if [ $i = 0 ]
--

if [ $i=0 ] 是可以的,我事先跑过的. 不过严格来讲养成按照你的用法是比较好的习惯.
作者: kenduest    时间: 2008-04-24 16:18
原帖由 incle 于 2008-4-24 16:12 发表
if [ $i=0 ] 是可以的,我事先跑过的. 不过严格来讲养成按照你的用法是比较好的习惯.


這不一樣意思,而且十萬八千里呢....


  1. SayyaBBS:kendlee@~> a=0
  2. SayyaBBS:kendlee@~>
  3. SayyaBBS:kendlee@~> if [ $a=0 ]; then echo yes; fi
  4. yes
  5. SayyaBBS:kendlee@~>
  6. SayyaBBS:kendlee@~> if [ $a = 0 ]; then echo yes; fi
  7. yes
复制代码


  1. SayyaBBS:kendlee@~> a=100
  2. SayyaBBS:kendlee@~>
  3. SayyaBBS:kendlee@~> if [ $a=0 ]; then echo yes; fi
  4. yes
  5. SayyaBBS:kendlee@~>
  6. SayyaBBS:kendlee@~> if [ $a = 0 ]; then echo yes; fi
  7. SayyaBBS:kendlee@~>
复制代码


--
作者: incle    时间: 2008-04-24 16:21
原帖由 kenduest 于 2008-4-24 16:18 发表


這不一樣意思,而且十萬八千里呢....


SayyaBBS:kendlee@~> a=0
SayyaBBS:kendlee@~>
SayyaBBS:kendlee@~> if [ $a=0 ]; then echo yes; fi
yes
SayyaBBS:kendlee@~>
SayyaBBS:kendlee@~> if [ $a ...

哦,是吗?我去试试看.
作者: incle    时间: 2008-04-24 16:26
果然如此,受教了.
谢谢BZ!
作者: davycu    时间: 2008-04-25 08:47
原帖由 kenduest 于 2008-4-24 15:31 发表
1. 這個問題在 linux 版系統篇來問似乎比較適合.

2. bash 內您的 for 語法使用錯誤。for 語法例子使用像是有:


for i in 1 2 3 4 5
do
   echo $i
done



for((i=0;i


这问题应该在Shell版问更合适点哈,此版版主还真有涵养的说
作者: digex    时间: 2008-04-25 09:58
赞斑竹,很好很强大
作者: sinboy2002    时间: 2008-04-25 11:50
i=$(rsync  -avl --include "*/" --include "GameLog.ini" --exclude "*" /usr/richman/rich/gs1-game/ /usr/richman/GameLog | echo $?)
------------------------------
上面那行做什么的
i=$(some_command_goes_here > /dev/null 2>&1;echo $?)

...
作者: to407    时间: 2008-04-25 20:59
标题: 回复 #21 sinboy2002 的帖子
这什么帖嘛……都High了
作者: MMMIX    时间: 2008-04-25 21:26
原帖由 kenduest 于 2008-4-24 16:18 发表


這不一樣意思,而且十萬八千里呢....

嗯,在 shell 中 test 和 [ ] 是一回事,[ ] 中的内容是传给 test(1) 的参数,如果缺少空格,参数解析就会出问题。如果是

  1. if [ $a=0 ]
复制代码

test 会将 $a=0 整个作为其参数(当然是在 $a 被替换后),而如果用

  1. if [ $a = 0 ]
复制代码

test 的参数就是 $a, = 和 0 了。
作者: marsaber    时间: 2008-05-03 07:46
哎!
人不大,火气还不小!
条条大路通罗马,实现你那功能的语句在高手眼里,求的不是通,而是精。
你看你,逻辑都没顺好。
if [ $i = 0 ]
中间都是用空格隔开的。
更多man test
作者: sdu_lizhipeng    时间: 2008-05-03 11:20
楼上的说的是正确的,确实应该是if [ $i = 0 ]或者if [ $i -eq 0 ]  “=”用于字符串比较 “-eq”用于算术比较
我这里有个教程,感觉不错
http://www-128.ibm.com/developer ... h/bash-1/index.html




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