次のスクリプトを作成しようとしています。
- 名前に「foobar」を含むファイルを探す
- スクリプトはこのファイルで実行され、出力は自動的に生成され、検索されたファイルと同じ名前の新しいCSVファイルに保存する必要があります。唯一の違いは、拡張子がCSVに変更されることです。
これは私のスクリプトです。 :
#!/bin/bash
# search for file containing "foobar" as a name in the directory
for file in /home/user/Documents/* ;
do
if [[ "$file" == *"$foobar"* ]]; then
touch /home/user/Documents/collectCSV/csv1.csv
# executing script of modelising foobar file ==> extract some data from $foobar file and insert it in the
# created file csv1.csv
/home/user/scriptModelise.pl $file >> /home/user/Documents/collectCSV/csv1.csv
else
echo "foobar file not found"
fi
done
問題は、このファイルの生成方法が静的であることです。ファイルの自動生成に失敗しました。私は、foobarファイルを見つけたときに作成される新しいファイルでそれをモデル化することを意味します。
助けが必要ですか?
ベストアンサー1
使いやすくなります(このように変数の引用を解除すると、すでにzsh
構文を使用しています)。zsh
#! /bin/zsh -
files=(/home/user/Documents/*foobar*(N))
if (($#files)) {
ret=0
for f ($files) {
/home/user/scriptModelise.pl $f > $f:h/collectCSV/$f:t:r.csv || ret=$?
}
exit $ret
} else {
echo >&2 No non-hidden foobar file
exit 1
}
csh
と同様に、head(dirname)、tail(basename)、root(拡張子の削除)$f:h
です。$f:t
$f:r
((arithmetic expression))
ksh
評価など算術表現ゼロ以外の値である場合は true を返します。$#array
、ksh
s を連想させる${#string}
配列の長さを提供します (要素数で表示)。ksh
/ では、bash
配列は実際には別々の型ではないため、${#array[@]}
インデックス0${#array}
の要素の長さ(文字)が必要です。(N)
:glob修飾子。一致するものがない場合は空の状態に展開されます。$f
、$files
:他のBourne様シェルとは異なり、変数は引用符で囲む必要はありません(NULL値を含まない限り)。他のシェル(ksh、bash、yash)では、"$f"
とが必要です"${files[@]}"
。