複数のフォルダに入るシェルスクリプトを書いています。現在、フォルダーの名前をシェル変数に保存していますpath="October\ @012/"
。実行するcd $path
と、エラーbash が表示されます: cd: October\: No such file or directory
私は何を間違っていますか?
これは二重引用符の (主要な) 機能であり、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
%
(例を追加するために編集)
編集:私はもともと中括弧の使用を推奨するために書いていました。夜中に目が覚めたときにこれを書き、答えを修正しました。
まず、スクリプトを記述しているシェルによって異なります。bash の場合は、変数名を引用符で囲んでみてください。
TARGET="October @012"
cd "$TARGET"
これは、他のシェルでも機能する可能性があります。試してみることをお勧めします。
編集:
これを再検討すると、式の間違った部分をエスケープしているように見えます。これを試して:
path="October \@012"
cd "$path"