bash 스크립트에서 놀라운 동작이 있습니다. 스크립트는 다음과 같이 최대한 단순화하려고 노력했습니다.
test.sh :
DBOK=$(sqlplus -s user/xxx as sysdba<<EOF
set feed off pages 0 echo off
SELECT decode(value,'TRUE','CLUSTER','FALSE','NONCLUSTER','UNKNOWN') from v\$parameter where name='cluster_database';
EOF
)
echo x"$DBOK"y
set -x
if [ "${DBOK}" == NONCLUSTER ]; then
echo "not a cluster do nothing"
fi
set +x
이 스크립트를 직접 실행하면 정상적으로 작동합니다.
bash ./path/test.sh
> xNONCLUSTERy
> ++ '[' NONCLUSTER == NONCLUSTER ']'
> ++ echo 'not a cluster do nothing'
> ++ set +x
하지만 스크립트를 "점 공백 슬래시"모드로 실행하면 (필요한 경우 최종 목표는 현재 프로세스의 환경을 수정하는 것입니다) 작동하지 않습니다.
. /path/test.sh
test
xNONCLUSTERy
++ '[' 'NONCLUSTER' == NONCLUSTER ']'
++ set +x
SQL 스크립트의 결과로 변수를로드하면 제대로 작동하고 결과가 양호한 것으로 보입니다. 그러나 테스트 비교를 할 때 현재 프로세스에서 스크립트를 실행하면 손상되는 것처럼 보입니다 ???
어떤 도움을 주시면 감사하겠습니다.
Adrian의 의견에 따라 hexdump 명령으로 편집하십시오.
$ ./test.sh
00000000 4e 4f 4e 43 4c 55 53 54 45 52 0a |NONCLUSTER.|
0000000b
xNONCLUSTERy
++ [[ NONCLUSTER == NONCLUSTER ]]
++ echo 'not a cluster do nothing' not a cluster do nothing
++ set +x
$. ./test.sh
00000000 1b 5d 30 3b 6f 72 61 63 6c 65 40 6e 61 74 71 6f |.]0;oracle@natqo|
00000010 72 61 30 34 3a 7e 2f 73 63 72 69 70 74 73 2f 74 |ra04:~/scripts/t|
00000020 6f 6f 6c 73 20 7c 20 73 71 6c 70 6c 75 73 20 2d |ools | sqlplus -|
00000030 73 20 6c 65 64 62 61 40 51 42 4f 41 55 44 49 54 |s ledba@QBOAUDIT|
00000040 20 61 73 20 73 79 73 64 62 61 07 4e 4f 4e 43 4c | as sysdba.NONCL|
00000050 55 53 54 45 52 0a |USTER.|
00000056
xNONCLUSTERy
++ [[ NONCLUSTER == NONCLUSTER ]]
++ set +x
나는 당신의 기본 쉘이 bash
당신이 생각하는 것과 다르다고 생각합니다. Bash 구문을 사용하고 ==
있으며 일반 비 bash 테스트는 ==
. 두 가지 선택 :
=
대신 테스트로 사용하십시오 ==
. 이것은 모든 Posix 기반 셸과 원래 Bourne Shell에서 작동합니다.#! /bin/bash
스크립트 상단에 추가 하여 다른 쉘이 아닌 Bash를 사용하고 있는지 확인하십시오. 쉘을 가정하지 마십시오. 그리고 모든 Bash를 사용 [[ ... ]]
하는 경우 테스트에서 [ ... ]
. 이것은 Kornshell, Dash 및 Ash 셸에서도 작동합니다./bin/sh
가에 연결되어 있어도 /bin/bash
를 통해 호출 될 때 Bash는 Bash처럼 작동하지 않습니다 sh
. 대신 순수한 POSIX 모드로 작동한다고합니다. (나는 Kornshell이 완전한 POSIX 호환 쉘이기 때문에 주장하고 있으며 Kornshell이 수행하는 특정 작업이 작동하지 않는다는 것을 알고 있습니다 /bin/sh
).
맥 OS X에서 /bin/sh
연결되어 있습니다 /bin/bash
. Linux 시스템에서는 /bin/sh
POSIX를 더 잘 준수한다고 가정 하는 Ash 또는 Dash 셸을 사용합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다