2011-09-16 15 views
0

このbashスクリプトで入力のフォーマットを実行するのが難しいです。 かなり簡単ですが、 'newstring ='で始まる行を実行するとsed操作は実行されません。自分の入力を最初の空白まで表示してからsedコマンドを直接印刷します後に。私は間違って何をしていますか?私に問題を起こす単純なbashスクリプト

#! /bin/bash 

##format paths/strings with spaces to escape the spaces with a forward-slash'\' 
##then use 'open' to open finder at current-set directory (based on path) 

oldstring="$1" 
newstring="$oldstring | sed 's/ /\\ /g')" 
cd $newstring 
open . 

答えて

4

newstring=`echo "$oldstring" | sed 's/ /\\ /g')` 
+2

しかし、 'newstring = $(echo" $ oldstring "| sed 's// \\/g')'を使う方がはるかに良いです。 –

+1

また、 'bash'でも(他のシェルAFAIKではなく)' newstring = $(sed 's// \\/g' <<< "$ oldstring") 'を使うことができます。 '$ oldstring'を二重引用符で囲む必要はないかもしれませんが、害はありません。 –

+0

そして、ステートメント –

5

のように逆引用符でコマンドを入れてみてくださいあなたは、単に実行する必要があります。

cd "$1" 
open . 

これはsedスクリプトは」doesnのこと、様々な問題にサブプロセスやお得な情報を実行している回避(例えば、$シンボルを含む名前、または他のシェルメタキャラクタ)。一般に、変数(または位置パラメータ($1など)がスペースを含む可能性のあるファイル名である場合は、毎回二重引用符で囲んだファイル名を使用します。

+0

Wowの最後に ')'をつけてください。ありがとうございました。シンプルなソリューションは常に最高です。 – i4n

+2

+1ですが、通常はすべての変数の拡張を引用する必要があります。 – Sorpigal

1

@Jonathan Leffler'sは正しい解決法です。エスケープを追加すると、実際にはダブルクォートが行いません。しかし、私の代わりにsedのはbashの組み込みの置換機能を使ってエスケープを追加するためのより良い方法があることを指摘し、この機会を取るよ:

newstring="${oldstring/ /\\ }" 

だから、あなたは、間違っを実装するためのより良い方法を、それを持っています溶液。個人的に、私はJonathan'sに投票しました。