0

私はシェルスクリプトを初めて使用し、特定のスクリプトで次のコード行を見つけました。

誰かが次のコード行が何を意味するのか説明してもらえますか

  1. _filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

  2. printk "archiveWLS(): ${_filecount} file(s)"

助けてくれてありがとう

4

3 に答える 3

2
_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

wc -w:wcは単語数、wordcountは単語、行、文字などを数え、-wは単語数のみを出力します。

出力はawkにパイプされ、出力の最初のワードのみを出力します。使用する場合

 wc -w FILE 

ファイル名が出力され、awkで削除するのが理にかなっています。ファイル名がないパイプ出力でそれを行うのは不要です。

割り当てとして、行は代わりに次のようになります。

_filecount=$(echo ${_filelist} | wc -w )

$(...)またはバッククォートがないと機能せず、filecountには「echo」という単語が割り当てられます。うまく書かれていないスクリプトのようです。

printkはbashで定義されておらず、coreutilsからの確立されたgnuプログラムでもありません。

たぶんそれはスクリプト自体で定義されています。

于 2012-05-02T09:57:56.037 に答える
1

_filelist変数の単語数を_filecountに格納します。精緻化:

_filecount=` echo ${_filelist} | wc -w | awk '{ print $1 }'`
これがルールなので`sでラップする必要があります。

echoは、 _filelistに格納されているものをwcに渡します。

wc(単語カウンター)はそれを受け取り(この中間結果の受け渡しはパイピングと呼ばれます)、- wオプションで呼び出されるため、すでにawkに単語数のみを出力し、行数と文字数を保持します。 。

次に、 awkは、提供されたものの最初の列を出力します(awk'{print $ 1}' `)。

wcはここで1列、つまり単語数のみを提供するため、awkの呼び出しは実際には冗長です。

printf "archiveWLS(): ${_filecount} file(s)"

_filecountの値を文字列に置き換え、それを標準出力ストリームに渡します。これはたまたまシェル出力ウィンドウです。それでおしまい。

于 2012-05-02T09:58:00.990 に答える
0

このスクリプトが行うことは、基本的に何もありません。

_filecount=echo ${_filelist} | wc -w | awk '{ print $1 }'

この行は構文的には有効ですが、正しくない可能性があります。

echoこれは、次のコマンドの実行中のみ存在する一時的な変数の割り当てとして解釈されているように見えるためです。したがって、環境変数は、変数に格納されたコマンドの実行中に の_filecount値を持ちます。コマンド名が含まれておらず、代わりに1つ以上の実行不可能なファイルの名前が含まれているため、エラーが発生します。echo_filelist_filelistcommand not found

行の残りの部分は無関係です。${_filelist}コマンドは stdout に何も出力しないため、何もリダイレクトされませんでしたwc -wwcは 0 個の単語がカウントされたことを報告し、この値は に渡されawk、先頭の空白が取り除かれます。

おそらくあなたが言いたかったことは、もっと似ていた

_filecount=$(echo ${_filelist} | wc -w | awk '{ print $1 }')

echoパイプラインを実行し、結果を_filecount変数に格納します。

次のようにスペースで区切られた文字列にファイル リストを格納することは、実際には良い考えではありません (たとえば、ファイルの名前にスペースを含めることができます)。代わりにbash、次のように配列を使用します。

_filelist=("file1.txt" "file2.txt")

これを でファイルのリストに展開すると"${_filelist[@]}"、すべて適切に引用され、次の方法でファイルの数を取得できます。

_filecount=${#_filelist[@]}

これははるかに高速で (外部ユーティリティを呼び出す代わりにインプロセスで実行されます)、より信頼性が高くなります (「1 つのファイルは 1 つの単語」というセマンティクスに依存しません)。

この行については:

printk "archiveWLS(): ${_filecount} file(s)"

呼び出される bash ビルトインはなくprintk、 と呼ばれる標準ユーティリティもないprintkため、結果は次のようになります。

-bash: printk: command not found

これには次のように使用できますprintf

printf "archiveWLS(): ${_filecount} file(s)"

そして、出力は次のようになります

archiveWLS(): 0 file(s)

0の値はどこにありますか_filecount

ただし、次のように言う方が適切です。

printf 'archiveWLS(): %s file(s)\n' "${_filecount}"

上記と同じように出力され、最後に改行が含まれ、保守が容易になります。

于 2012-05-02T10:47:52.590 に答える