2012-10-08 54 views
0

我想要寫我自己的腳本舒適焦油使用率(也變得更有經驗的殼)和我的腳本下降:shell腳本落在

cmd=$1 
tarname=$2 
files=${*:3} 

echo_green(){ 
    echo -e "\033[1;[email protected]\033[0m" 
} 
echo_blue(){ 
    echo -e "\033[1;[email protected]\033[0m" 
} 
create(){ 
    echo_blue 'create' 
    case $tarname in 
     *.tar) tar -cvf $tarname $files; echo_green $tarname created;; 
     *.tar.gz) tar -cvzf $tarname $files; echo $tarname created;; 
     *.tar.bz2) tar -cvjf $tarname $files; echo_green $tarname created;; 
    esac 
} 
show(){ 
    _cmd='tar -tv' 
    case $tarname in 
     *.tar) _cmd+='f' ;; 
     *.tar.gz) _cmd+='zf' ;; 
     *.tar.bz2) _cmd+='jf' ;; 
    esac 
    _cmd_all=$_cmd" $tarname | awk '{print \$6}' | cut -d'/' -f 1" 
    echo $_cmd_all 
    content="$($_cmd_all)" 
    exit 
    IFS=' 
' 
    _cmd_folder=$_cmd" $tarname | head -1 | awk '{print \$6}' | cut -d'/' -f 1" 
    echo $_cmd_folder 
    folder="$($_cmd_folder)" 
    all_in_one=1 
    for l in $content; do 
     if [ ! $l = $folder ]; then 
     all_in_one=0; 
     break; 
     fi 
    done 
    echo $all_in_one 
} 
case $cmd in 
    "create") create;; 
    "show") show;; 
esac 

錯誤:

$ bash bash_lesson.sh show 4.tar 
tar -tvf 4.tar | awk '{print $6}' | cut -d'/' -f 1 
tar: You may not specify more than one `-Acdtrux' or `--test-label' option 
Try `tar --help' or `tar --usage' for more information. 

但如果我只是在控制檯中運行有問題的字符串,一切正常:

$ tar -tvf 4.tar | awk '{print $6}' | cut -d'/' -f 1 
test_dir 
bash_lesson 
+0

從未從文件列表中創建*永遠不會*從文件列表創建*。將這些文件放在一個目錄中,並創建一個目錄的tarball。 –

+0

嘗試:'content =「$(eval $ _cmd_all)」' –

回答

2

您需要評估字符串。正因爲如此,在該行 content="$($_cmd_all)",外殼調用與 參數焦油:-tvf 4.tar | awk '{print $6}' | cut -d'/' -f 1 也就是說,它是通過|作爲參數,而不是評估其作爲 管道。 tar看到兩個-f選項並失敗。只需將腳本更改爲:

content="$(eval $_cmd_all)" 
+0

謝謝:)另外,我知道父目錄,我會考慮它 – scythargon

+0

嗯,我卡住了。我想要如果用戶強制轉換'my_script pack name.tar file1 file2' - 創建包文件中的主文件夾到它 - 如何做到這一點? – scythargon

+0

'mkdir tmpdir; ln $ tmpdir; tar czf $ tarname tmpdir; rm -rf tmpdir' –