사용자 입력의 유효성을 확인하는 스크립트를 bash로 작성하려고합니다.
입력 (변수 x
)을 유효한 값 목록 과 일치시키고 싶습니다 .
내가 지금 생각해 낸 것은 :
for item in $list
do
if [ "$x" == "$item" ]; then
echo "In the list"
exit
fi
done
내 질문은 더 간단한 방법이 있다면list.contains(x)
대부분의 프로그래밍 언어
와 같은 것 입니다.
덧셈:
Say list is :
list="11 22 33"
내 코드는 list
문자열이 아닌 배열로 취급 되므로 해당 값에 대해서만 메시지를 에코합니다 . 모든 문자열 조작은 유효성 1
을 검사 하지만 실패 할 것입니다.
답변
[[ $list =~ (^|[[:space:]])$x($|[[:space:]]) ]] && echo 'yes' || echo 'no'
또는 함수를 작성하십시오.
contains() {
[[ $1 =~ (^|[[:space:]])$2($|[[:space:]]) ]] && exit(0) || exit(1)
}
그것을 사용하려면 :
contains aList anItem
echo $? # 0: match, 1: failed
답변
Matvey는 옳지 만 $ x를 인용하고 모든 종류의 “공백”(예 : 줄 바꾸기)을 고려해야합니다.
[[ $list =~ (^|[[:space:]])"$x"($|[[:space:]]) ]] && echo 'yes' || echo 'no'
그래서, 즉
# list_include_item "10 11 12" "2"
function list_include_item {
local list="$1"
local item="$2"
if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
# yes, list include item
result=0
else
result=1
fi
return $result
}
그런 다음 종료
`list_include_item "10 11 12" "12"` && echo "yes" || echo "no"
또는
if `list_include_item "10 11 12" "1"` ; then
echo "yes"
else
echo "no"
fi
""
변수의 경우에 사용해야 합니다.
`list_include_item "$my_list" "$my_item"` && echo "yes" || echo "no"
답변
IMHO 가장 쉬운 해결책은 원래 문자열 앞에 공백을 추가하고 추가하여 정규 표현식을 확인하는 것입니다. [[ ]]
haystack='foo bar'
needle='bar'
if [[ " $haystack " =~ .*\ $needle\ .* ]]; then
...
fi
이것은 바늘을 서브 스트링으로 포함하는 값이있는 값 (예 : 건초 더미)에 대해서는 오 탐지가 아닙니다. foo barbaz
.
(이 개념은 JQuery의 hasClass()
-Method에서 뻔뻔스럽게 도난 당했습니다.)
답변
어때?
echo $list | grep -w $x
출력을 확인하거나 $?
위의 줄을 확인하여 결정을 내릴 수 있습니다.
grep -w
전체 단어 패턴을 확인합니다.
답변
이중 괄호를 사용하는 경우 case 문 외부에서 (* 와일드 카드)를 사용할 수도 있습니다.
string='My string';
if [[ $string == *My* ]]
then
echo "It's there!";
fi
답변
스크립트에서 값 목록을 하드 코딩해야하는 경우을 사용하여 테스트하는 것이 매우 간단합니다 case
. 다음은 요구 사항에 적응할 수있는 간단한 예입니다.
for item in $list
do
case "$x" in
item1|item2)
echo "In the list"
;;
not_an_item)
echo "Error" >&2
exit 1
;;
esac
done
런타임에 목록이 배열 변수이면 다른 답변 중 하나가 더 적합합니다.
답변
목록이 스크립트에 고정되어 있으면 다음이 가장 좋습니다.
validate() {
grep -F -q -x "$1" <<EOF
item 1
item 2
item 3
EOF
}
그런 다음 허용 validate "$x"
여부를 테스트 하는 데 사용하십시오 $x
.
한 줄짜리를 원하고 항목 이름의 공백을 신경 쓰지 않으면 이것을 사용할 수 있습니다 ( -w
대신에 통지 -x
).
validate() { echo "11 22 33" | grep -F -q -w "$1"; }
노트:
- 이것은 POSIX를
sh
준수합니다. validate
하위 문자열을 허용 하지 않습니다 (-x
원하는 경우 grep 옵션을 제거하십시오 ).validate
인수를 정규식이 아닌 고정 문자열로 해석합니다 (-F
원하는 경우 grep 옵션을 제거하십시오 ).
기능을 수행하는 샘플 코드 :
for x in "item 1" "item2" "item 3" "3" "*"; do
echo -n "'$x' is "
validate "$x" && echo "valid" || echo "invalid"
done