条件エラーの場合

条件エラーの場合

パスワードに小文字と大文字が含まれていることを確認しましたが、行19でエラーが発生しました。

myscript.sh:

#!bin/sh

read password
conditionarr=(0 0)

if [[ $password =~ [A-Z] ]]
then
   condtionarr[1]=1
fi


if [[ $password =~ [a-z] ]]
then
   conditionarr[0]=1
fi


if [ ${conditionarr[0]} == 1 || ${conditionarr[1]} == 1 ]
then
    printf "%s" "Yes\n "
else
    printf "%s" "No\n"
fi

間違い:

./myscript.sh: line 19: [: missing `]'

./myscript.sh: line 19: 0: command not found

このコードにはどのような問題がありますか?誰でもこの問題を解決する方法を教えてもらえますか?

ベストアンサー1

コードにはいくつかの問題があります。

  • - 行を読む必要があります(または#!インタプリタまたはシステム#!/bin/bashへの完全な絶対パス)。bash使用しているシェルコードには必要なので、シェルが非bash標準や配列の使用法などを理解していない可能性があるため、インタプリタ#!に-lineを指定することは正しくありません。sh[[ ... ]]

  • 端末の入力がエコーされるのを防ぎ、問題なく使用でき、サイドスペースなどを許可するには、IFS= read -s -rinを使用してパスワードを読む必要があります。bash\

  • 複数のテストを書くことをお勧めします[ ... ] || [ ... ]。これが実際のエラーメッセージの原因です。ユーティリティ[はわかりません||

提案:

#!/bin/bash

IFS= read -p 'Enter password: ' -sr password
check=(0 0)

[[ $password =~ [A-Z] ]] && check[0]=1
[[ $password =~ [a-z] ]] && check[1]=1

if [ "${check[0]}" = 1 ] || [ "${check[1]}" = 1 ]; then
    echo yes
else
    echo no
fi

または、もはや配列がありません。

#!/bin/bash

IFS= read -p 'Enter password: ' -sr password

if [[ $password =~ [A-Z] ]] ||
   [[ $password =~ [a-z] ]]
then
    echo yes
else
    echo no
fi

テスト$password文字列が一致します。[A-Z] または一致は[a-z]1回のテストで完了できます[A-Za-z]

shシェルでは、次のようにスクリプトを作成できます。

#!/bin/sh

printf 'Enter password: ' >&2

state=$(stty -g)    # save stty state
stty -echo          # turn off local echo
IFS= read -r password
stty "$state"       # reset stty state to original

case $password in
        *[A-Za-z]*)
                echo yes
                ;;
        *)
                echo no
esac

大文字と小文字のテストを1つのテストにまとめ、使用されたパターンはcase正規表現ではなくシェルグローブパターンです。

上位レベルを確認する必要がある場合そして小文字の場合でも、2つの別々のテストが必要です。

case $password in (*[A-Z]*) check1=true;; (*) check1=false; esac
case $password in (*[a-z]*) check2=true;; (*) check2=false; esac

if "$check1" && "$check2"; then
    echo yes
else
    echo no
fi

おすすめ記事