ls *.txt | wc
後でループで使用できるように、別の変数としてどのように使用できますか?それは
count.files=$(ls *.txt | wc)
...
if count.files -ne 2000; then
echo "message"
fi
試してみましたが、うまくいかないようです。
答え1
コードにいくつかのエラーがあります。
- ほとんどのシェルでは、変数名にドットを含めることはできません。
- 旗を
wc
持って電話する必要があります-l
- 旗を
ls
持って電話する必要があります-d
- オプションの終わりを表示する
--
か、./
プレフィックスを使用する必要があります。ls
- テスト
if
に括弧がありません(ただし、スタック交換形式になる可能性があります)。 - ファイル名に改行文字が含まれている場合、この方法は機能しません。
- 隠しファイルは省略されます。
より良い作業例は次のとおりです。
file_count=$(ls -d ./*.txt | wc -l)
if [ $file_count -ne 2000 ]; then echo "message"; fi
答え2
あなたが考慮している機能は規律だと思います。これはksh93
ユニークな機能です:
function count.get {
.sh.value=$(set -- ~(N)*.txt; echo "$#")
}
その後、$count
展開するたびに規律関数を呼び出し、値を割り当てます。
では、zsh
変数の内容をコードとして定義することもできます。
count='$(set -- *.txt(N); echo "$#")'
${(e)count}
拡張時に評価するコードとして使用しますe。
しかしながら、これらの方法は、関数を使用する標準的なアプローチに比べて利点がほとんどない。
count() (
set -- [*].txt *.txt
case $1$2 in
'[*].txt*.txt') echo 0;;
*) echo "$#"
esac
)
(このトリックは、nullglobオプション(上記の 'sまたは'など)をサポートするシェルを使用して[*]
回避できます。)ksh93
~(N)
zsh
(N)
そしてそれを$(count)
(コマンドの置き換え)。
(コードに関するすべての質問については、他の回答を参照してください)
答え3
wc -l
まず、改行文字のみを使用してください。これは働きます:
#!
filecounter=$(ls *.txt | wc -l)
if [ $filecounter -ne 2000 ]; then echo "message"
fi