2016-07-02 10 views
0

Im Moment mache ich ein Bash-Skript, das Tarballs entpackt, um sie zu installieren. Ich bin auf der Seite, die die Tarballs in eine directoy auspackt. Dies ist das Skript:Testen von Dateitypen in Bash-Skripten und Verwenden der entsprechenden Befehle zum Entpacken

#!/Bin/bash/ 

# This program auto-installs tarballs for you. 
# I designed this for Linux noobies who don't 
# know how to install tarballs. Or, it's for 
# people like me who are just lazy, and don't 
# want to put in the commands ourselves. 

echo "AutoTar v1.1" 
echo "Gnu GPL v2.1" 
read -p "Path to tarball:" pathname 
cd "${pathname/#~/$HOME}" 
    ls $pathname 
     read -p "Please enter the file you wish to complile..." filename 
if [-a $filename] == false 
    then 
    echo "File does not exist! Exiting the program." 
if [[ ${filename -d} ==*.tar.gz ]] 
then 
    tar -xzf $filename 
done 
else if 
    [[ ${filename -d} ==*.tgz ]] 
then 
    tar -xzf $filename 
done 
else if 
    [[ ${filename -d} ==*.tar.bz2 ]] 
then 
    tar -xjf $filename 
done 
ls $pathname 
echo -n "Please enter the directory of the file you have just unpacked...:" 
read directory 
cd $directory 

Was ich tun müssen, ist die Verwendung einer if-Anweisung, um die Datei und mit dem entsprechenden Befehl zu erkennen, aber ich bin nicht ganz sicher, wie dies zu tun. Mit dem aktuellen Code, den ich habe, bekomme ich einfach den Fehler:

autotar.sh: line 18: conditional binary operator expected 
autotar.sh: line 18: syntax error near `==*.tar.gz' 
autotar.sh: line 18: `if [[ ${filename -d} ==*.tar.gz ]]' 
+0

http://shellcheck.net/ ist dein Freund. Repariere alles was es findet, dann komm zurück. –

+0

(Ich würde vorschlagen, dass Sie Ihre Frage vorübergehend löschen, während Sie das tun, um Downvotes zu vermeiden, und sie dann wieder löscht, wenn Sie noch Fragen haben). –

+0

... Nun, eigentlich ist dein Code so schlimm, dass Shellcheck ihn nicht analysieren kann. Okay, hier könnte eine Antwort notwendig sein. –

Antwort

1

Wenn Sie überprüfen wollen, dass eine Datei nicht existiert:

if [[ ! -e $filename ]]; then ## works in bash or other ksh derivatives only 

... oder, um die Kompatibilität mit älteren Schalen :

if [ ! -e "$filename" ]; then ## works in any POSIX shell 

Wenn Sie für eine Erweiterung überprüfen möchten:

if [[ $filename = *.tar.gz ]]; then ## works in bash or other ksh derivatives only 

... oder für eine von vielen Erweiterungen zu überprüfen, sollten Sie eine case Anweisung statt:

# this works in any POSIX shell 
[ -e "$filename" ] || { echo "$filename does not exist" >&2; exit 1; } 

# this, too, works in any POSIX shell 
case $filename in 
    *.tar.gz|*.tgz) tar -xzf "$filename" ;; 
    *.tar.bz2|*.tbz2) tar -xjf "$filename" ;; 
    *.tar.xz|*.txz) xz -d <"$filename" | tar -xv ;; 
    *.zip)   unzip "$filename" ;; 
esac 

Hinweis, insbesondere:

  • Leer wesentlich ist. Sie können keine Leerzeichen weglassen. [ "$foo" = 1 ] ist eine gültige und korrekte Anweisung, während [$foo=1] und [ "$foo" =1] Syntaxfehler sind, und [ "$foo"==1 ] gibt immer true zurück, egal welchen Wert foo hat.
  • Mit Ausnahme bestimmter Ausnahmeregelungen ist die Angabe von Erweiterungen für das korrekte Verhalten erforderlich. Wenn Sie nicht sicher sind, ist die sichere Sache, sie zu verwenden: Sie können Anführungszeichen in [[ ]] oder case auslassen nur diese haben spezielle Syntaxregeln, die sie optional machen. Wenn Sie stattdessen [ ] verwenden, müssen Sie sie verwenden: if [ ! -e "$filename" ].

    jedoch tar -xzf "$filename" oder echo "$filename" oder ls "$pathname" alle brauchen Räume mit interessanten Dateien oder Pfad richtig zu arbeiten (versuchen Sie Namen mit Leerzeichen in der Software zu testen; Namen mit glob Zeichen sind eine weitere häufige Ursache für potenzielle Fehler, vor allem wenn sie kombiniert werden).

  • [ ist nur ein Synonym für test; Es ist ein Befehl, keine spezielle Syntax, und Befehle folgen normalen Parsing-Regeln. So wie Sie test$foo=false nicht ausführen können, können Sie [$foo=false] oder [-a $filename] nicht ausführen; es muss [ -e "$filename" ] sein (unäre Verwendung von -a ist nicht in der POSIX-Spezifikation für test vorhanden, daher der Wechsel zu -e).