2017-07-05 4 views
2

シェル変数内の項目数を数える私はシェル変数sampleDirを持って

/home/sample_001 /home/sample_002 /home/sample_003 

(サンプルの下にサブディレクトリがあります注意してください_ ***もの)

これらの項目のうちどれがこの$ sampleDir変数に含まれているかを調べたい場合は、どうすればよいでしょうか? (3を返すことを期待)

+0

:より良い方法は、あなたが興味を持っていると、その上のfindのようなコマンドを実行したディレクトリの名前を格納するかもしれません。 '/ subdir'部分はどこから来ますか? –

+0

@MadPhysicist申し訳ありませんあなたのコメントを見ました。私は投稿を編集しました。ありがとうございました。 – Helene

答えて

4

ストア配列内の変数:配列内のアイテムの数を取得する

sampleDir=(/home/sample*) 

使用パラメータ展開:

echo "${#sampleDir[@]}" 
+0

非常にシンプルでクリーンな答えをありがとう! – Helene

3

sampleDir=/home/sample*sampleDir

にリテラル '/home/sample*'を割り当て
$ echo "$sampleDir" 
/home/sample* 

ただし、変数を二重引用符で囲まないと(set -fがオンである場合を除く) と、$IFS文字(通常はスペース、タブ、改行などの可変文字のIFSの文字)で分割されます。

が引数を数えている関数に、引用符で囲まれていない$sampleDirを渡すことで、展開後のアイテムの数を数えることができます。

argc() { argc=$#; } 
argc $sampleDir 
echo $argc  #will print the number of items $sampleDir expanded to 

これは、(配列のようなものをベースにしたソリューションは、それらを持っているシェルに限定されている)を使用すると、任意のPOSIXシェルで、移植性にそれを行うことができますどのようになります。


(私は関数と同じ名前のグローバル変数に割り当てることによってシェル関数からのものを返すお勧めします。 それは、ポータブル名前空間クリーン、かつ非常に高速です(エコーして、取得するためにキャプチャを使用したとは異なり、エコーされた文字列、一般的ですがかなり高価です))

+0

徹底的な説明をいただきありがとうございます!シェルで学ぶことがたくさんあります:) – Helene

2

あなたの文字列のスペースの数を数えて1つを追加しようとしています。これを行う良い方法のa numberがあります。入力への最短はおそらく

COUNT=$(grep -o ' ' <<< "$sampleDir" | wc -l) 
((COUNT++)) 

の線に沿って何かである。このアプローチの問題は、あなたがどこかのファイル名にスペースを持つことができないということです。私は出力がセットアップ与えられたと信じていることはよく分からない

sampleRoot=/home 
find "$sampleRoot" -name 'sample*' | wc -l 
+0

非常に便利です。私は実際にwc -lのアプローチがあるかどうか疑問に思った:) – Helene

関連する問題