1

複数のフォルダに入るシェルスクリプトを書いています。現在、フォルダーの名前をシェル変数に保存していますpath="October\ @012/"。実行するcd $pathと、エラーbash が表示されます: cd: October\: No such file or directory

私は何を間違っていますか?

4

2 に答える 2

6

これは二重引用符の (主要な) 機能であり、csh および *sh シェルに当てはまります。

cd "$TARGET"

するべきです。

シェル変数は"..."( 内とは異なり'...') 内で展開されますが、引用符で囲まれたテキストは、シェルがコマンド ラインを解析してプログラムに渡される文字列を構築するときに、単一の引数と見なされます。

例えば:

% ls -F
October @012/
% TARGET="October @012"
% cd $TARGET
bash: cd: October: No such file or directory
% cd "$TARGET"
% pwd
/tmp/t/October @012
% 

単純!

最初の例で間違っているのは、引用符のスペースをエスケープすることです。スペースを 2 回エスケープする必要はありません。この冗長部分\は引用符内に表示されるため、TARGET 変数にバックスラッシュを挿入するだけです。例えば:

% TARGET="October\ @012"  # wrong!
% ls
October @012/
% cd $TARGET
bash: cd: October\: No such file or directory
% cd "$TARGET"
bash: cd: October\ @012: No such file or directory
% 

この設定はTARGET、ディレクトリの名前October\ @012が で、バックスラッシュが含まれている場合にのみ機能します (お勧めしません!):

% mkdir October\\\ @012
% ls -F
October\ @012/
% cd "$TARGET"
% pwd
/tmp/t/October\ @012
% 

(例を追加するために編集)

于 2012-11-01T12:21:15.153 に答える
1

編集:私はもともと中括弧の使用を推奨するために書いていました。夜中に目が覚めたときにこれを書き、答えを修正しました。

まず、スクリプトを記述しているシェルによって異なります。bash の場合は、変数名を引用符で囲んでみてください。

TARGET="October @012"

cd "$TARGET"

これは、他のシェルでも機能する可能性があります。試してみることをお勧めします。

編集:

これを再検討すると、式の間違った部分をエスケープしているように見えます。これを試して:

path="October \@012"

cd "$path"
于 2012-11-01T08:54:52.160 に答える