藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教一個if判斷的問題!

有帖子說,任何一個程序或者命令都會送回一個一個值:0或者1
0代表操作成功,1代表操作失敗,那麼我是否可以把任何一個操作
放在if [操作]來進行判斷呢,比如

......
if [ tar -c | gzip -9 >"$1".tar.gz];then
echo "operation successfully!"
exit 0
else
exit 1

我在一個備份腳本裡這麼寫了,為什麼老是出錯?
[root@guoxin bin]# mybackup /root/perlfolder /perlfolder
/usr/bin/mybackup: line 17: [: missing `]'
gzip: ]: No such file or directory


我的shell script名稱叫 mybackup 它需要傳入兩個參數:
第一個參數代表要打包壓縮的文件名,第二個參數代表打包後的文件名,在我的腳本中
要進行參數測試,只有參數正確才予以處理,下面是我的完整的script

#! /bin/bash
# this is a file backup tool shell

if [ -z "$1" ];then
   echo "Error:missed filename you want to backup!"
   exit 1
fi
if [ ! -e "$1" ];then
      echo "Error:no such a file or diretory:$1"
      exit 1
fi

if [ -z "$2" ];then
   echo "Error:missed filename after backup!"
   exit 1
fi
if [ tar -c "$1" | gzip -9 > "$2".tar.gz ];then
echo "Opration successfully!"
exit 0
else
exit 1
fi

大家幫我看看是什麼問題呀,是不是tar命令不能放在if的判斷中啊?
是不是tar命令不返回任何值啊?

我把那個if語句後面的[] 去掉了,就沒有出現上述的這個錯誤了,但有出現新的錯誤,
比如我現在運行這個script 並且帶入合適的參數:
$ mybackup /root/perlfolder  /usr/perlfolder
出現如下的結果:我不明白意思!
tar: Removing leading `/' from member names
Opration successfully!


奇怪的是,我在/usr/確實又看見了剛剛生成的perlfolder.tar.gz 這個壓縮文件

為什麼會出現:tar: Removing leading `/' from member names 是什麼意思啊??

沒人回答,我自己頂啊

你可以先寫一個需求,然後用$?判斷=0就是成功,=1就是失敗。

謝謝樓上的大哥,能否說具體一點,就我那個腳本而言

我說說

把if語句[]改成[[ ]]試試,注意用法[[ abc ]],要有空格

tar -c | gzip -9 >"$1".tar.gz
if [ $? = 0 ]; then
echo "operation successfully!"
exit 0
else
exit 1
fi

這一句到底錯在哪裡?
if [ tar -c | gzip -9 >"$1".tar.gz];then

不能那樣直接判斷的,如果用輸出的值的話要用反引號。

哦,謝謝大哥,我再按照你說的試試

我把if [ tar -c "$1" | gzip -9 > "$2".tar.gz ]換成了if ` tar -c "$1" | gzip -9 > "$2".tar.gz`
運行:
$ mybackuo  /root/perfolder    /usr/perlfolder
但是還是出現如下的錯誤:
tar: Removing leading `/' from member names

可以在/usr/確實成功地生成了perlfolder.tar.gz這個文件.
那麼那個錯誤信息有意味著什麼:
tar: Removing leading `/' from member names

1) 不是0 成功, 1 失敗. 而是 0 是"真", 非 0 是假.
2) [ xxx ] 是 test 命令, 請 man test 瞭解 expression 有哪些
3) if 後面是 command , 但不是 command 的 stdout , 因此 if `xxx xxxx` 是錯的, 去掉 ` ` 就行.

-->

我按照網中人大哥的說話,去掉了``,還是不行
$ mybackuo  /root/perfolder    /usr/perlfolder
但是還是出現如下的錯誤:
tar: Removing leading `/' from member names

可以在/usr/確實成功地生成了perlfolder.tar.gz這個文件.
那麼那個錯誤信息有意味著什麼:
tar: Removing leading `/' from member names

這不是 錯誤 , man tar 看看關於 / 的處理? 尤其是 -P 選項.

看了網中人大哥的解釋,我瞭解了很多,謝謝!

在我如上的問題中,確實存在大哥你說的這個錯誤,我按照你說的改了。
從邏輯上來說,這個 script應該是沒有問題了,不過真正
在運行時還是那個小問題:

$ mybackuo  /root/perfolder    /usr/perlfolder
tar: Removing leading `/' from member names
命令操作結束後,我卻在/usr/下看見了生成的perlfolder.tar.gz
這說明操作是成功,為什麼卻提示這個錯誤:tar: Removing leading `/' from member names
根據我的script mybackup 的要求,傳入了兩個參數:/root/perfolder    /usr/perlfolder
第一個參數:/root/perlfolder是要打包和壓縮的文件夾的絕對路徑;
第二個參數:/usr/perlfolder是打包後欲生成的壓縮文件的絕對路徑和文件名前綴



我真不知道是什麼原因老是出現這個問題:tar: Removing leading `/' from member names
希望有經驗的大哥大姐們幫幫小弟!

上述腳本現在完全可以對單個文件夾或者單個文件進行打包壓縮了,但是
卻不能使用通配符號對一個文件下的所有文件進行打包,不知道為什麼!
既不報錯,也沒有看到打包壓縮的結果,下面是我的打包壓縮script:
###############################################
# mybakup
#! /bin/bash

if [ $# -lt 2 ];then
echo "missed file name:that you want to packet or after pachect"
exit 1
fi
if [ ! -e "$1" ];then
   echo "Error:no such a file or diretory:$1"
exit 1
fi

if  tar -c "$1" | gzip > "$2".tar.gz ;then
echo "Opration successfully!"
exit 0
else
exit 1
fi
###############################################

比如有這樣一個文件夾/root/perl,裡面有很多以perl開頭的RPM包,我使用我的打包壓縮腳本:

$ cd /root/perl
$ mybackup perl* /usr/perl
結果就是沒有反應,也不報錯。

請幫忙看看

請讀13問之補充1

謝謝斑竹的提醒喲



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com