2016-04-15 10 views
0

Guten Tag zu ersetzen,Wie man einen Wert in einer Variablen

ich ein einfaches UNIX Skript test.sh

Ich brauche den Wert einer Variablen zu ersetzen. Diese Variable enthält einen Verzeichnispfad.

Mein test.sh Skript

#!/bin/sh 
filepath="/host/messages/in/documents" 
archivePath=`${filepath/\/in/\/archive/}` 
echo "archive path is " $archivePath 

Ich erhalte eine "schlechte Substitution" Fehler, wenn ich es laufen.

sollte die erforderliche Ausgabe für archivePath sein:

/host/messages/archive/documents 

Was mache ich falsch und was eine mögliche Lösung sein könnte?

+2

Falsch: nicht dem manuellen Seite Shell zu lesen. Lösung: Lesen Sie die Handbuchseite der Shell. Und bedenke, dass nicht die ganze Welt eine Bash ist. Substitution ist keine Eigenschaft von POSIX-Shells, es ist eine Erweiterung einiger anderer Shells (bash und zsh kommen mir in den Sinn). Hinweis: Die Backticks verursachen ** Prozesssubstitution **, nicht ** Parametersubstitution **. – Jens

+0

Wenn nicht ersetzen, wie ersetzen ich dann "in" zu "archivieren" ?. – Chor419

Antwort

1

Muss bash (oder KSH oder zsh), verwenden Sie die korrekte Syntax ${varname/pattern/replacement} und Flucht / von \ in pattern und replacement.

#!/bin/bash 
filepath="/host/messages/in/documents" 
archivePath="${filepath/\/in\//\/archive\/}" 
echo "archive path is $archivePath" 
+0

Ich habe keine Bash, Ksh oder Zsh auf meinem UNIX-Betriebssystem. – Chor419

+0

Wirklich? Was sagen 'ls -l/bin/sh' und'/bin/sh --version'? Plain POSIX sh kann die Syntax '$ {varname/pattern/replacement}' nicht erkennen. – fumiyas

0

eine Lösung gefunden, mit sed:

#!/bin/sh 
filepath="/host/messages/in/documents" 
echo $filepath | sed -e %s/in/archive/g 
archivePath=`echo $filepath | sed -e s/in/archive/g` 
echo "archive path is $archivePath"