最近シェルスクリプトの使用を開始しました。そのため、ユーザーからファイル名を入力するときに空白を与えると、私のコードがそれを処理できないという問題に直面しました。同じ答えでも
私のコードは次のとおりです
echo "---------------- Please provide the filename -------------------------"
read filename
if [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
誰でも私を助けることができますか?入力パラメータに空白が指定されている場合は、エラーが発生するように空白文字を処理する方法があります。
ありがとう
答え1
正規表現を使用して確認できます。
完全なコードは次のとおりです。
if [[ $filename =~ \ ]]; then
printf "error"
exit(1)
elif [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
答え2
ファイル名を制限するのはなぜですか?ほとんどのファイルシステムでは、Unixファイル名にはNUL(\ 0)とスラッシュ(/)を除く任意の文字を含めることができます。以前と同じように、文字と数字だけを期待する習慣に陥り、予期しないことが発生したときにパニックに陥るよりも、珍しいファイル名を処理する方法を学ぶ方が良いでしょう。
スペースやその他の奇妙な文字を含むファイル名を処理する方法についての記事を読むことをお勧めします。
最初のヒントは、変数の周りに常に二重引用符を使用することです。場合によってはこれを行う必要はありませんが、初心者の場合は常に実行する方が簡単です。これだけで、今解決したい特定の問題を解決できます。
find
次に、私が推奨するのは、このコマンド、特にその演算子が好きな方法を読んで学ぶことです-exec
。これにより、ファイルディレクトリツリー全体を操作するときに正しい操作を簡単に実行できます。たとえば、次の作業は絶対にしないでください。
for f in *; do
do-something-with-a-file "$f"
done
ファイル名にスペース、タブ、改行文字が含まれていると正しく機能しません(たとえば、ファイル名に改行文字を含めることができます!)。さらに、ファイルとディレクトリを区別することはできません。
代わりに、以下を実行してください。
find -maxdepth 1 -type f -exec do-something-with-a-file {} \;
この-maxdepth
演算子は、結果を現在のディレクトリにある結果に制限し、ディレクトリ以外のファイルだけが必要であることを-type f
知らせ、各ファイルに対して一度実行して代わりにファイル名(正しく引用)を渡します。したがって、セミコロンの前のバックスラッシュはシェル用です。シェルはセミコロンを処理せずにコマンドに渡します。find
-exec somecommand {} \;
somecommand
{}
find
これは、ファイル名を正しく処理する方法の簡単な入門書です。お願いしますトピックに関する内容を読む、問題がある場合は、ここにさらに質問を投稿することができます。