Bashの比較:変数にスペースとシェル構文が含まれている場合は、構文エラー/コードの挿入を防ぎます。

Bashの比較:変数にスペースとシェル構文が含まれている場合は、構文エラー/コードの挿入を防ぎます。

変数値を何かと比較するとき(算術比較をしようとするので使用できません。)"x$VAR" == "xyes"いたずら)、変数に空白および/またはシェル構文が含まれているときにこれを防ぐ方法は何ですか?

$ (b="-z foo"; if [[ "$b" -eq 5 ]]; then echo foo; fi)
+(:50): b='-z foo'
+(:50): [[ -z foo -eq 5 ]]
-bash: [[: -z foo: syntax error in expression (error token is "foo")

試みられた:単一および二重括弧、算術評価((()))、引用および引用されていない、"${b##-}"さらに"${b@Q}"確認された。https://mywiki.wooledge.org/BashPitfalls

ベストアンサー1

値が10進数でなければならず、ユーザーが混乱しているエラーやスクリプトの中断イベントが発生しないようにするには、変数に数値以外の文字が含まれているかどうかをテストし、独自のエラーメッセージとして処理します。

[[ -z ${val} ]] && {
  echo "$0: Oops, \"${val}\" is empty" >&2
  exit 1
}
[[ ${val} =~ [^[:digit:]] ]] && {
  echo "$0: Oops, non-numeric characters found in \"${val}\"" >&2
  exit 1
}

値が空白を必要としない文字列の場合は、同様の手法を使用して空白を確認します。

[[ ${val} =~ [[:blank:]] ]] && {
  echo "$0: Oops, \"${val}\" contains space or tab characters" >&2
  exit 1
}

改行、キャリッジリターン、フォームフィード、垂直タブもテストするには、[:space:]文字クラスを使用してください。

これが私がbash v4.xスクリプトでやっていることです。他のシェルに対する提案はありません。

おすすめ記事