私は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/test
Bashスクリプト):
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/"test
1
2
3"/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