文字列を渡す条件をテストするためのシェルスクリプト

文字列を渡す条件をテストするためのシェルスクリプト

条件文字列は、大文字、小文字、またはアンダースコア(_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

これは予約された文字であるためです。

&はバックグラウンドでコマンドを実行することを意味します。

*実際のディレクトリ内のすべてのファイル/ディレクトリを確認し、それを引数として渡します。

( ) コマンドシーケンスのデフォルト設定または関数宣言の場合

これらの文字を文字列に表示するには、引用符「」または「」の中に入れます。

関連情報