パスワードに小文字と大文字が含まれていることを確認しましたが、行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 -r
inを使用してパスワードを読む必要があります。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