掘削

掘削

式の結果(つまり、コマンドの出力)を変数に代入し、それに対処したいと思います。たとえば、それを文字列に関連付けてからエコーします。これが私が得るものです:

#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;

ただし、これは次のように出力されます。

Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is: 

したがって、 に割り当てられていないように見えますが、$thefile実行時に印刷されます。

私は何を見逃していますか?

ベストアンサー1

シェル割り当ては、等号の後にスペースがない単語です。だからあなたが書いたのはnull値を割り当てることですthefile。さらに、割り当てはコマンドとともにグループ化されるため、thefile環境変数が生成され、割り当てはその特定のコマンドに対してローカルです。つまり、呼び出し側だけがls割り当てられた値を表示できます。

コマンドの出力をキャプチャしようとしているので、以下を使用する必要があります。コマンドの置き換え:

thefile=$(ls -t -U | grep -m 1 "Screen Shot")

(一部の文献は代替構文を示していますthefile=`ls …` 。逆引用符の構文は、時々逆引用符内の引用が奇妙であることを除いて、ドル括弧の構文と同じですので、使用してください$(…)。)

スクリプトに関する追加の注:

  • -t(時間でソート)と-U(GNUでソートされていない)を組み合わせることlsは意味がありません-t

  • 一致するスクリーンショットを使用するよりもワイルドカードを渡し、それを使用して最初のファイルをキャプチャする方がきれいになりますgreplshead

      thefile=$(ls -td -- *"Screen Shot"* | head -n 1)
    
  • 通常一つ出力の解析に関する悪い考えls。ファイル名に印刷できない文字が含まれていると、大幅に失敗する可能性があります。ただし、これがないと、日付でファイルを並べ替えるのは難しいですls。したがって、ファイル名に印刷できない文字やバックスラッシュがないことがわかっている場合は、これが許容されるソリューションです。

  • 変数の置換には常に二重引用符を使用してください。つまり、ここに書いてください

      echo "Most recent screenshot is: $thefile"
    

    二重引用符がないと変数値が再び拡張されるため、スペースやその他の特殊文字が含まれていると問題が発生する可能性があります。

  • 行の末尾にはセミコロンは必要ありません。重複しますが無害です。

  • シェルスクリプトでは、通常、次のものを含めるのが最善です。set -e。これは、コマンドが失敗した場合(ゼロ以外の状態を返す)と、シェルが終了するように指示します。

findGNUがありsort(特に組み込まれていないLinuxまたはCygwinを実行している場合)、最新のファイルを見つける別の方法があります。findファイルとその日付をリストしてからsortandを使用します(ここではNULで区切られたレコードを読み取るとしますread)。 )最新のファイルを抽出します。bashzsh-d ''

IFS=/ read -rd '' ignored thefile < <(
  find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@/%p\0" |
    sort -rnz)

bashの代わりにzshでこのスクリプトを作成したい場合は、zshから最新のファイルをキャプチャする簡単な方法があります。グローバル予選名前だけでなくファイルメタデータにもワイルドカードの一致が許可されます。(om[1])パターンに続く部分はglob修飾子です。om一致するアイテムは、年齢が増加する基準でソートされ(つまり、変更時間に応じて最新のアイテムから)、[1]最初の一致のみが抽出されます。完全一致は技術的に配列なので、括弧内に入れる必要があります。なぜなら、globbingはファイルのリストを返すからです。これは[1]、この特定のケースでは、リストに(最大)1つのファイルが含まれていることを意味しても同じです。

#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
print -r "Most recent screenshot is: $thefile"

おすすめ記事