Bash의 'if'문에서 두 문자열 변수를 어떻게 비교합니까? [복제]
이 질문에 이미 답변이 있습니다.
- Bash 10 답변 에서 문자열을 비교하는 방법
Bashif
에서 작동 하도록 성명 을 얻으려고합니다 ( Ubuntu 사용 ).
#!/bin/bash
s1="hi"
s2="hi"
if ["$s1" == "$s2"]
then
echo match
fi
나는 다양한 형태의 시도했습니다 if
사용하여 문을 [["$s1" == "$s2"]]
사용하여 따옴표없이 =
, ==
그리고 -eq
,하지만, 난 여전히 다음과 같은 오류가 발생합니다 :
[hi : 명령을 찾을 수 없음
여러 사이트와 튜토리얼을 살펴보고 복사했지만 작동하지 않습니다. 내가 뭘 잘못하고 있습니까?
결국 $s1
에는이 포함 $s2
되어 있는지 말하고 싶습니다. 어떻게해야합니까?
방금 공백 비트를 계산했습니다. : / 어떻게 포함한다고 말합니까?
나는 시도했다
if [[ "$s1" == "*$s2*" ]]
하지만 작동하지 않았습니다.
문자열 비교를 위해 다음을 사용하십시오.
if [ "$s1" == "$s2" ]
찾는 a
포함 b
, 사용 :
if [[ $s1 == *"$s2"* ]]
(심볼 사이에 공백을 추가해야합니다) :
나쁜:
if ["$s1" == "$s2"]
좋은:
if [ "$s1" == "$s2" ]
공백이 필요합니다.
if [ "$s1" == "$s2" ]
변수에 다음이 포함 된 경우 '['기호와 큰 따옴표 사이에 공백을 두도록주의해야합니다.
if [ "$s1" == "$s2" ]; then
# ^ ^ ^ ^
echo match
fi
^
의 당신이 떠날 필요가 빈 공간을 보여줍니다.
나는 이것을 제안한다 :
if [ "$a" = "$b" ]
여는 / 닫는 대괄호와 변수 사이의 공백과 '='기호를 감싸는 공백을 확인하십시오.
또한 스크립트 헤더에주의하십시오. 당신이 사용하든 같은 것이 아닙니다
#!/bin/bash
또는
#!/bin/sh
여기에 소스가 있습니다.
내가 제안 할게:
#!/bin/bash
s1="hi"
s2="hi"
if [ $s1 = $s2 ]
then
echo match
fi
큰 따옴표없이 하나만 같음.
Bash4 + 예제. 참고 : 따옴표를 사용하지 않으면 단어에 공백 등이 포함 된 경우 문제가 발생합니다. 항상 bash IMO에서 따옴표를 사용합니다.
다음은 BASH4 +의 몇 가지 예입니다.
Example 1, check for 'yes' in string (case insensitive):
if [[ "${str,,}" == *"yes"* ]] ;then
Example 2, check for 'yes' in string (case insensitive):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Example 3, check for 'yes' in string (case sensitive) :
if [[ "${str}" == *"yes"* ]] ;then
Example 4, check for 'yes' in string (case sensitive):
if [[ "${str}" =~ "yes" ]] ;then
Example 5, exact match (case sensitive):
if [[ "${str}" == "yes" ]] ;then
Example 6, exact match (case insensitive):
if [[ "${str,,}" == "yes" ]] ;then
Example 7, exact match :
if [ "$a" = "$b" ] ;then
This question has already great answers but here it appears that there is a slight confusion between using single equal and double equals in
if [ "$s1" == "$s2" ]
The main difference lies in which scripting language are you using. If you are using bash then include #!/bin/bash
in the starting of the script and save your script as filename.bash
. To execute use bash filename.bash
- then you have to use ==
.
If you are using sh then use #!/bin/sh
and save your script as filename.sh
. To execute use sh filename.sh
- then you have to use single =
. Avoid intermixing them.
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
I don't have access to a linux box right now, but [ is actually a program (and a bash builtin), so I think you have to put a space between [ and the first parameter.
Also note that string equality operator seems to be a single =
This is more clarification than answer ! Yes , the clue is in the error message:
[hi: command not found
which shows you that your "hi" has been concatenated to the "[".
Unlike in more traditional programming languages, in Bash, "[" is a command just like the more obvious "ls" etc. - it's not treated specially just because it's a symbol, hence the "[" and the (substituted) "$s1" which are immediately next to each other in your question, are joined (as is correct for Bash) and it then tries to find a command in that position: [hi - which is unknown to Bash.
In C and some other languages, the "[" would be seen as a different "character class" and would be disjoint from the following "hi".
Hence you require a space after the opening "[".
#!/bin/bash
s1="hi"
s2="hi"
if [ "x$s1" == "x$s2" ]
then
echo match
fi
Adding additional string inside makes it more safe.
You could also use other notation for single line commands:
[ "x$s1" == "x$s2" ] && echo match
For a version with pure Bash and without test
, but really ugly, try:
if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
echo match
fi
Explanation: In ( )
an extra subshell is opened. It exits with 0 if there was a match, and it tries to exit with $s1 if there was no match which raises an error (ugly). This error is directed to /dev/null
.
'Program Tip' 카테고리의 다른 글
Entity Framework의 SqlException-세션에서 실행중인 다른 스레드가 있으므로 새 트랜잭션이 허용되지 않습니다. (0) | 2020.10.03 |
---|---|
Python에서 현재 사용자 이름을 가져 오는 이식 가능한 방법이 있습니까? (0) | 2020.10.03 |
Java의 foreach 루프에서 제거 호출 (0) | 2020.10.03 |
주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까? (0) | 2020.10.03 |
왜 this ()와 super ()가 생성자의 첫 번째 문장이어야합니까? (0) | 2020.10.03 |