BASH의 목록에 변수가 있는지 확인하는 방법
사용자 입력의 유효성을 확인하는 펼쳐집니다.
입력 (번호 x
)을 유효한 값 목록 과 일치 합니다.
내가 지금 생각해 낸 것 :
for item in $list
do
if [ "$x" == "$item" ]; then
echo "In the list"
exit
fi
done
내 질문은 대부분의 프로그래밍 언어
와 같은 간단한 방법이 있는지 여부 list.contains(x)
입니다.
추가 :
목록은 다음과 같습니다.
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"
이중 괄호를 사용하는 경우 문 외부에서 (* 와일드 카드)를 사용할 수 있습니다.
string='My string';
if [[ $string == *My* ]]
then
echo "It's there!";
fi
IMHO는 가장 쉬운 가능성을 추가하고, 추가로 추가 할 가능성이 있습니다. [[ ]]
haystack='foo bar'
needle='bar'
if [[ " $haystack " =~ .*\ $needle\ .* ]]; then
...
fi
이것은 바늘을 서브로 포함하는 값이있는 값 (예 : haystack)의 경우에는 오 탐지가 아닙니다 foo barbaz
.
(이 개념은 JQuery의 hasClass()
-Method에서 뻔뻔스럽게 도난 당했습니다)
어때?
echo $list|grep $x
출력을 확인하거나 $?
위의 줄을 확인하여 결정을 내릴 수 있습니다.
목록이 펼쳐져 고정되어 있으면 다음이 가장 좋습니다.
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
원하는 경우 그렙을 옵션 제거하십시오 ).validate
인수를 정규식이 아닌 고정 된 경우 해석합니다 (-F
원하는 경우 grep 옵션을 제거하십시오 ).
기능을 수행하는 샘플 코드 :
for x in "item 1" "item2" "item 3" "3" "*"; do
echo -n "'$x' is "
validate "$x" && echo "valid" || echo "invalid"
done
펼쳐야하는 것이 매우 간단합니다 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
실행에 목록이 배열 변수이면 다른 답변 중 하나가 더 적합합니다.
echo $LIST | xargs -n1 echo | grep $VALUE
아래 그림과 같이 양식을 사용하는 것이 더 많이는 것을 알았습니다 .
LIST="ITEM1 ITEM2"
VALUE="ITEM1"
if [ -n "`echo $LIST | xargs -n1 echo | grep -e \"^$VALUE`$\" ]; then
...
fi
이것은 공백으로 구분 된 목록에서 작동하지만 :
다음을 수행하여 다른 구분 기호 (예 :)에 적용 할 수 있습니다 .
LIST="ITEM1:ITEM2"
VALUE="ITEM1"
if [ -n "`echo $LIST | sed 's|:|\\n|g' | grep -e \"^$VALUE`$\"`" ]; then
...
fi
"
테스트가 작동 하려면 이 필요합니다.
연관 배열 의 키 활용을 고려하십시오 . 프로파일 링하지는 않았지만 정규식 / 패턴 매칭과 루핑을 능가한다고 생각합니다.
declare -A list=( [one]=1 [two]=two [three]='any non-empty value' )
for value in one two three four
do
echo -n "$value is "
# a missing key expands to the null string,
# and we've set each interesting key to a non-empty value
[[ -z "${list[$value]}" ]] && echo -n '*not* '
echo "a member of ( ${!list[*]} )"
done
산출:
one is a member of ( one two three ) two is a member of ( one two three ) three is a member of ( one two three ) four is *not* a member of ( one two three )
예
$ in_list super test me out
NO
$ in_list "super dude" test me out
NO
$ in_list "super dude" test me "super dude"
YES
# How to use in another script
if [ $(in_list $1 OPTION1 OPTION2) == "NO" ]
then
echo "UNKNOWN type for param 1: Should be OPTION1 or OPTION2"
exit;
fi
in_list
function show_help()
{
IT=$(CAT <<EOF
usage: SEARCH_FOR {ITEM1} {ITEM2} {ITEM3} ...
e.g.
a b c d -> NO
a b a d -> YES
"test me" how "test me" -> YES
)
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ "$#" -eq 0 ]; then
show_help
fi
SEARCH_FOR=$1
shift;
for ITEM in "$@"
do
if [ "$SEARCH_FOR" == "$ITEM" ]
then
echo "YES"
exit;
fi
done
echo "NO"
TARGET 변수가 '이항'또는 '회귀'일 수 있다고 가정하면 다음과 같이됩니다.
# Check for modeling types known to this script
if [ $( echo "${TARGET}" | egrep -c "^(binomial|regression)$" ) -eq 0 ]; then
echo "This scoring program can only handle 'binomial' and 'regression' methods now." >&2
usage
fi
|로 구분하여 목록에 더 많은 문자열을 추가 할 수 있습니다. (파이프) 캐릭터.
egrep 사용의 장점은 대소 문자 구분 (-i)을 쉽게 추가하거나 정규 표현식으로 더 복잡한 시나리오를 확인할 수 있다는 것입니다.
내 솔루션을 목록에 추가 할 것이라고 생각했습니다.
# Checks if element "$1" is in array "$2"
# @NOTE:
# Be sure that array is passed in the form:
# "${ARR[@]}"
elementIn () {
# shopt -s nocasematch # Can be useful to disable case-matching
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
# Usage:
list=(11 22 33)
item=22
if elementIn "$item" "${list[@]}"; then
echo TRUE;
else
echo FALSE
fi
# TRUE
item=44
elementIn $item "${list[@]}" && echo TRUE || echo FALSE
# FALSE
이것은 거의 원래 제안이지만 거의 1 줄입니다. 다른 유효한 답변만큼 복잡하지 않으며 bash 버전에 따라 다르지 않습니다 (이전 bash에서 작동 가능).
OK=0 ; MP_FLAVOURS="vanilla lemon hazelnut straciatella"
for FLAV in $MP_FLAVOURS ; do [ $FLAV == $FLAVOR ] && { OK=1 ; break; } ; done
[ $OK -eq 0 ] && { echo "$FLAVOR not a valid value ($MP_FLAVOURS)" ; exit 1 ; }
제 제안은 길이와 스타일면에서 여전히 개선 될 수 있다고 생각합니다.
참고 URL : https://stackoverflow.com/questions/8063228/how-do-i-check-if-a-variable-exists-in-a-list-in-bash
'IT' 카테고리의 다른 글
javax.el.PropertyNotFoundException 노출 및 해결 : 도달 할 수없는 대상 (0) | 2020.07.20 |
---|---|
jQuery를 사용하여 30 분 안에 쿠키를 종료하는 방법은 무엇입니까? (0) | 2020.07.20 |
nodejs 연결은 정적을 수 없습니다 (0) | 2020.07.20 |
google-services.json은 무엇을 무엇을 가지고 있습니까? (0) | 2020.07.20 |
Mac OSX에서 기본 게이트웨이를 얻는 방법 (0) | 2020.07.20 |