web-dev-qa-db-ja.com

bashのファイルパスで変数を使用できますか?もしそうなら、どのように?

ディレクトリ内で最後に追加されたファイルを見つけて、そのファイルを別の場所に移動するための小さなシェルスクリプトを作成しようとしています。私が使用する場合:

ls -t ~/directory | head -1

次に、これを変数VARIABLE_NAMEに格納します。なぜ、次の方法でこれを〜/ otherdirectoryに移動できないのですか。

mv ~/directory/$VARIABLE_NAME ~/otherdirectory

この辺りを検索してGoogleで検索しましたが、ファイルパスで変数を使用する方法についての情報がないようです。これを行うためのより良い方法はありますか?

編集:スクリプトの一部は次のとおりです。

ls -t ~/downloads | head -1
read diags
mv ~/downloads/$diags ~/desktop/testfolder
9
TheVideotapes

スクリプトで次のことを実行できます。

diags=$(ls -t ~/downloads | head -1)
mv ~/downloads/"$diags" ~/desktop/testfolder

この場合、diagsにはls -t ~/downloads | head -1の値が割り当てられ、mvから呼び出すことができます。

13
assefamaru

次のコマンド

ls -t ~/downloads | head -1
read diags

おそらく意図したものではありません。readコマンドは、以前はコマンドからの入力を受け取りません。代わりに、stdinからの入力を待機します。これが、スクリプトが「ハング」すると信じている理由です。たぶんあなたは次のことをしたかったでしょう(少なくともこれはより良い解決策を提供するための私の最初の誤った試みでした):

ls -t ~/downloads | head -1 | read diags

ただし、パイプの各要素が個別のコマンドとして実行されるため、これも(alvitsで言及されているように)機能しません。したがって、変数diagsは親シェルの一部ではなく、サブプロセスの一部です。

したがって、適切な解決策は次のとおりです。

diags=$(ls -t ~/downloads | head -1)

ただし、後続のmvコマンドが失敗する可能性のある問題がさらにあります。

  • ディレクトリが空である可能性があります。
  • ファイル名には、スペース、改行などが含まれる場合があります。
0
Dirk Herrmann