条件文字列は、大文字、小文字、またはアンダースコア(_abc、xyz、またはAbcなど)で始まります。
文字列には、_f9、f10、car20、またはtop10carsなど、最初の文字の後に数字を含めることができます。
文字列に! @# $ % ^ & * ( ) + - = などの特殊文字を含めないでください。
これは私の小さなスクリプトです。
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
&、*、または(などのパラメータのみを渡すと、スクリプトが機能せず、カーソルが戻ってこないため、Ctrl + Cを押す必要があるかもしれません)。
for example ./script.sh (abc
./script.sh &&
./script.sh &abc
スクリプトに何の問題がありますか?
答え1
引用する
スクリプト"$1"
では$1
。
コマンドラインで次を使用します。
./script '*(ontehu'
変える
./script *(ontehu
./script.sh (abc
これはシェル構文の構文エラーです。./script.sh &&
これにより、シェルはコマンドラインに条件付きANDがあると考え、演算子の右側に何かがあると予想します&&
。./script.sh &abc
./script
バックグラウンドプロセスとして起動(使用&
)とコマンドの2つのコマンドがありますabc
。
これらすべての場合、パラメータは引用符で囲む必要があります(理想的には一重引用符、シェル変数の値を補間するためにシェルが必要ない場合は二重引用符を使用する必要があります)。
あなたのスクリプト:
if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
引用する$1
:
if [[ "$1" =~ ^[A-Za-z_]+$ ]]; then
echo it matches
else
echo does_not match
fi
後に数字がある値が許可されます。
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
echo it matches
else
echo does_not match
fi
エラーを正しく報告します(追加)。
if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
printf '"%s" is a valid variable name\n' "$1"
else
printf '"%s" is not a proper variable name\n' "$1" >&2
exit 1
fi
答え2
これは予約された文字であるためです。
&はバックグラウンドでコマンドを実行することを意味します。
*実際のディレクトリ内のすべてのファイル/ディレクトリを確認し、それを引数として渡します。
( ) コマンドシーケンスのデフォルト設定または関数宣言の場合
これらの文字を文字列に表示するには、引用符「」または「」の中に入れます。