式の結果を
(つまり、コマンドからの出力)
変数に割り当ててから操作したいのですが、たとえば、
文字列と連結してから、エコーします。 。
これが私が持っているものです:
#!/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に割り当てられていないようです。 、実行時に印刷されます。
何が足りないのですか?
承認された回答:
シェル割り当ては、等号の後にスペースがない単一の単語です。したがって、あなたが書いたものは、thefileに空の値を割り当てます;さらに、割り当てはコマンドでグループ化されるため、thefileになります。 環境変数であり、割り当てはその特定のコマンドに対してローカルです。つまり、lsへの呼び出しのみです。 割り当てられた値を確認します。
コマンドの出力をキャプチャしたいので、コマンド置換を使用する必要があります:
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(一部の文献では、代替構文thefile=`ls …` が示されています;バッククォート構文はドル括弧構文と同等ですが、バッククォート内の引用が奇妙な場合があるため、$(…)を使用してください。 。)
スクリプトに関するその他の注意事項:
-
-tを組み合わせる (時間で並べ替え)-U(GNUlsで並べ替えないでください )意味がありません。-tを使用するだけです 。 -
grepを使用するのではなく スクリーンショットと一致させるには、ワイルドカードをlsに渡す方が明確です。headを使用します 最初のファイルをキャプチャするには:thefile=$(ls -td -- *"Screen Shot"* | head -n 1) -
lsの出力を解析することは一般的に悪い考えです 。印刷できない文字を含むファイル名がある場合、これは非常にひどく失敗する可能性があります。ただし、lsがないと、日付でファイルを並べ替えることは困難です。 、したがって、ファイル名に印刷できない文字や円記号が含まれないことがわかっている場合は、許容できる解決策です。 -
変数の置換は常に二重引用符で囲みます 、つまりここに書く
echo "Most recent screenshot is: $thefile"二重引用符がないと、変数の値が再展開され、空白やその他の特殊文字が含まれていると問題が発生します。
-
行末にセミコロンは必要ありません。冗長ですが無害です。
-
シェルスクリプトでは、多くの場合、
set -eを含めることをお勧めします。 。これは、コマンドが失敗した場合に終了するようにシェルに指示します(ゼロ以外のステータスを返すことによって)。
GNU findをお持ちの場合 およびsort (特に、埋め込まれていないLinuxまたはCygwinを実行している場合)、最新のファイルを検索する別の方法があります。findを使用します。 ファイルとその日付を一覧表示し、sortを使用します およびread (ここではbashを想定しています またはzsh -d ''の場合 NULで区切られたレコードを読み取るため)、最も若いファイルを抽出します。
IFS =/ read -rd''ファイルを無視<<(find -maxdepth 1 -type f -name "* Screen Shot *" -printf "%example@unixlinux.online /%p
Linux