指定された条件に一致するディレクトリのファイルを一覧表示します。ディレクトリ内の各ファイルに対して実行したいことの1つは、6桁の日付を抽出して変数に入れることです。私のスクリプトは現在次のとおりです
for i in $(ls $INPUT_DIR | egrep -i '^'$INPUT_FILE_PREFIX'[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01])'$INPUT_FILE_SUFFIX); do
MYDATE=$("$i" | grep -oP '\d{6,6}')
echo $MYDATE
done
上記の結果はエラーです"somefile": command not found
。
MYDATE=$("$i" | grep -oP '\d{6,6}')
私にとって奇妙なことはecho "$i" | grep -oP '\d{6,6}'
。
"$i"
スクリプトがコマンドの代わりに文字列として渡されるようにするにはどうすればよいですか?
ベストアンサー1
ファイル名から。で$INPUT_FILE_PREFIX
始まり、終わる6桁の数字を解析したいようです$INPUT_FILE_SUFFIX
。
これを行うことができます:
for name in "$INPUT_DIR/$INPUT_FILE_PREFIX"??????"$INPUT_FILE_SUFFIX"; do
test -f "$name" || continue
number=${name#$INPUT_DIR/$INPUT_FILE_PREFIX}
number=${number%$INPUT_FILE_SUFFIX}
printf "Number = %s\n" "$number"
done
数字のみが一致することを確認するには(該当する文字が何でも単一文字と一致する)、すべて?
をに変更します。[0-9]
?
ループのパラメータ置換は値の最初の部分を削除し、残りの$name
文字列の最後の部分を削除し、中間数字(プレフィックスとサフィックスの間の6文字)のみを変数に残します$number
。
注文する
MYDATE=$("$i" | grep -oP '\d{6,6}')
見つかったとおり、$i
呼び出しコマンドに含まれるすべての内容が解釈されます。また、echo
前に置くとうまく"$i"
いくと言いました。そしてそれははい:
MYDATE=$(echo "$i" | grep -oP '\d{6,6}')
あなたのコードに関連:なぜ`ls`を解析しないのですか?