![コマンド出力を変数[冗長]に設定するスクリプト](https://linux33.com/image/89725/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%87%BA%E5%8A%9B%E3%82%92%E5%A4%89%E6%95%B0%5B%E5%86%97%E9%95%B7%5D%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88.png)
私はユーザーに情報を要求し、それを変数として保存して他のコマンドにパラメータとして渡す簡単なスクリプトを書いています。変数の1つは、スペースを含めることができるパスを格納します。read
コマンドラベルを使用すると、パスは-r
バックスラッシュエスケープ文字を無視し、「生」入力として検索されます。
たとえば、
read -p "Enter checksum algorithm number (1, 224, 256, 384, 512, 512224, 412256): " -a shaa
read -p "Enter a file path: " -re shapath
問題は、エスケープ文字を読み取らないと、これらのパラメータを使用してコマンドを実行する方法がわからないことです。 @heemaylに従って解決しました
その後、コマンドの出力または戻り値を別の変数として保存する必要があります。
たとえば、
foo=$(shasum -a "$shaa" "$shapath")
しかし、echo $foo
予想される結果が得られなければ、shasum -a "$shaa" "$shapath"
代わりにshasum: /.../checksum.dmg
次のように使用してパイピングして動作させることeval
ができましたvar
。
eval shasum -a $sha $shapath > val
eval
私はどんな対価を払ってもそれを避けなければならず、スクリプトを続けることができないことを読んだ。
答え1
引用符を使用する:
shasum -a "$sha" "$shapath"
変数は、値に空白があるかどうかにかかわらず、単一の引数に展開されます。