이 문제를 해결할 수는 있지만 왜 그런 일이 발생하는지 이해할 수 없습니다.
내 임무는: (ksh)
- 1단계: sqlplus를 사용하여 데이터베이스에서 숫자를 쿼리합니다.
- 2단계: 이메일의 일부 텍스트 형식을 지정합니다.
- 3단계: 이를 이메일로 보내세요.
이것은 내 코드의 일부입니다.
psnr() {
sqlplus -s USR/PASS@PROD << EOS
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
이 함수를 호출하면 1234567이라는 숫자가 표시됩니다.
PSNR=$(psnr)
나는 이메일에 다음과 같은 문장을 썼다.
echo "Today's result is: $PSNR" > $MAILTMP
이 변수를 사용하고 싶다면메일 관리 계약tr -d '\040\011'
tr이 없으면 결과는 다음과 같기 때문에 stackexchange에서 찾은 것을 사용해야 했습니다 .
od -c mailtmp.17872.txt
0000000 T o d a y ' s r e s u l t i
0000020 s : \t 1 2 3 4 5
0000040 6 7 \n
0000043
"\t" 탭을 이해할 수 없습니다. sqlplus에서 이 탭이 어디에서 왔습니까? 어쩌면 데이터베이스에 특정한가요? (TOAD를 확인해보니 두 열 모두 숫자(18)입니다. ksh의 함수에 특별한 기능이 있는 것은 아닐까요?
답변1
또한 다른 데이터베이스를 사용할 때 원치 않는 공백이 발생했습니다. 분명히 SQLPlus와 같은 셸 스크립트와 도구를 사용하여 데이터베이스에서 데이터를 추출하는 것은 잘못된 일이지만 때로는 유용할 때도 있습니다.
내 해결책은 결과에서 선행 및 후행 공백을 제거하는 것이었습니다.
psnr() {
sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
문자열 구문이 ksh
지원되지 않으면 쉽게 바꿀 수 있습니다.$'...'
# Original style
sed $'s/^[ \t]*//'
# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"
또 다른 빠르고 더러운 수정은 셸을 사용하여 원하지 않는 공백을 제거하는 것입니다. psnr()
대신 다음과 같이 기능을 동일하게 유지하십시오 .
echo "Today's result is: $PSNR" > $MAILTMP
당신은 다음과 같이 쓸 것이다:
echo "Today's result is:" $PSNR > $MAILTMP
답변2
sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF
제공된 공백은 탭 문자입니다. 내 sqlplus 쿼리는 space
csv 형식으로만 출력되므로 이를 사용하여 원하지 않는 공간을 제거합니다.
echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar