Bashでスペースを含むディレクトリの周りに二重引用符を使用する方法

Bashでスペースを含むディレクトリの周りに二重引用符を使用する方法

私はRaspberry Pi OSで作業しています。

#!/bin/bash名前にスペースが含まれているディレクトリにファイル(キャプチャした画像)を保存する必要があるBashスクリプトを実行しています。

私の場合、ディレクトリは次のようになります。/media/pi/test 1 2 3

私が実行して必要なタスクを実行するコマンドは次のとおりです。

raspistill -awb greyworld -vf -hf -o /media/pi/"test 1 2 3"/test.jpg

写真を撮ってそこに保存すると、とてもうまくいきます。

私の問題は、「test 1 2 3」が次の変数の中にあることを望んでいることです。

usbToSave="\"test 1 2 3\"" #usbToSave is now "test 1 2 3"
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

しかし、上記は私に次のエラーを与えます:

Invalid command line option (1)

理由がわからない。フォーラムのどこかに似た質問に対する答えがあるようですが、見つかりません。検索時に適切なキーワードを使用していないようです。

メモ:

私のディレクトリにスペースがない場合(例:/media/pi/testBashスクリプト):

usbToSave="test"
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

エラーなしで動作します。

答え1

usbToSave="\"test 1 2 3\""
raspistill -awb greyworld -vf -hf -o /media/pi/$usbToSave/test.jpg

ここで変数の値に引用符を入力すると、割り当て後にが含まれます"test 1 2 3"。その後、二重引用符を使用せずに変数を拡張するため、単語分離の問題が発生します(以下のリンクを参照)。結果は、およびを別のコマンドライン引数にインポートraspistillすることです。/media/pi/"test123"/test.jpg

変数に入れた引用符は、結果の単語(の引数)のリテラルですraspistill変数拡張はいいえプレーンテキスト置換またはマクロ拡張: 通常、変数から出るすべてはシェル構文とは見なされません。引用符に加えて、シェル演算子(たとえば&&>など|)は、;変数内で展開されたときに通常の文字にすぎません。ここでは、単語の分割とファイル名の生成が唯一の例外です。

あなたがしなければならないことは:

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o "/media/pi/$usbToSave/test.jpg"

つまり、変数の拡張は二重引用符内で行われるため、単語の区切り(およびファイル名の生成)が防止されます。

望むより:

答え2

変数と参照がシェルでどのように機能するかを学びます。読む拡大する存在するman bash

usbToSave="test 1 2 3"
raspistill -awb greyworld -vf -hf -o /media/pi/"$usbToSave"/test.jpg

シェルの変数は、プログラミング言語で知っている実際の変数ではありません。これは、値に拡張されるマクロと多少似ています。変数が引用されていない場合、噴射その結果、これが発生した場合は、二重引用符を使用してこれを回避できます。

答え3

または、次のことができます。脱出するusbToSave="test 1 2 3"変数定義時の空白:前回答の文字usbToSave=test\ 1\ 2\ 3と同じ\脱出する次のスペース(または文字列に使用できるその他の特殊文字(例$))

編集:エスケープされた文字列の周りに二重引用符と引用符を追加することで、実行方法を明確にしました。

$ usbToSave_A="test 1 2 3"
$ usbToSave_B=test\ 1\ 2\ 3
$ echo $usbToSave_A
test 1 2 3
$ echo $usbToSave_B
test 1 2 3
$ echo /media/pi/"$usbToSave_A"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo /media/pi/"$usbToSave_B"/test.jpg
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_A/test.jpg"
/media/pi/test 1 2 3/test.jpg
$ echo "/media/pi/$usbToSave_B/test.jpg"
/media/pi/test 1 2 3/test.jpg

$ usbToSave_C='"test 1 2 3"'
$ usbToSave_D="test\ 1\ 2\ 3"
$ echo $usbToSave_C
"test 1 2 3"
$ echo $usbToSave_D
test\ 1\ 2\ 3
$ echo "/media/pi/$usbToSave_C/test.jpg"
/media/pi/"test 1 2 3"/test.jpg
$ echo "/media/pi/$usbToSave_D/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg
$ echo "/media/pi/"$usbToSave_C"/test.jpg"
/media/pi/'test 1 2 3'/test.jpg
$ echo "/media/pi/"$usbToSave_D"/test.jpg"
/media/pi/test\ 1\ 2\ 3/test.jpg

関連情報