2012-10-08 3 views
0

Je veux écrire mon propre script pour le goudron-utilisation confortable (et devenir plus expérimentés dans la coquille) et mon script tombe:script shell tombe

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 

erreur:

$ 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. 

mais si Je cours juste la chaîne problématique dans la console, tout est ok:

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

Les tarballs ne doivent jamais être créés à partir d'une liste de fichiers. Placez les fichiers dans un répertoire et créez une archive tar du répertoire. –

+0

Essayez: 'content =" $ (eval $ _cmd_all) "' –

Répondre

2

Vous devez évaluer la chaîne. Comme il est, dans la ligne content="$($_cmd_all)", la coquille appelle goudron avec les arguments: -tvf 4.tar | awk '{print $6}' | cut -d'/' -f 1 Autrement dit, il passe | comme argument au lieu de l'évaluer en tant que un tuyau. tar voit deux options -f et échoue. Remplacez simplement le script par:

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

merci :) aussi, je sais sur le répertoire parent et je le considérerais – scythargon

+0

hmm, je suis coincé. Je veux si l'utilisateur lance 'my_script pack name.tar fichier1 fichier2' - créer le dossier principal dans l'archive dans les fichiers pack - comment faire cela? – scythargon

+0

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