此问题已在此处有答案:
I just assigned a variable, but echo $variable shows something else(7个回答)
昨天关门了。
我有一个shell脚本,它连接到Oracle 19 c DB,将对象部署到同一DB中的2个模式,然后比较这两个模式以检查这两个模式之间的对象差异。我想把这些资料归档。按照我下面的代码,数据被保存在一个文件中,但没有格式化。无新行。一切都像一个大段落。
下面是我的示例代码:
#!/bin/sh
DT=`date '+%Y%m%d'`
log_dir=/test/${DT}
dbalogin=admin/pwd@SCOTT
Result1=`sqlplus -S $dbalogin << EOF
whenever sqlerror exit 1;
set feedback off
SET SERVEROUTPUT ON;
DECLARE
V_CNT NUMBER;
v_stmt VARCHAR2 (2000);
V_CNT1 NUMBER;
v_stmt1 VARCHAR2 (2000);
V_CNT2 NUMBER;
v_stmt2 VARCHAR2 (2000);
v_missobjects1 VARCHAR2 (32000);
v_missobjects2 VARCHAR2 (32000);
v_INVALIDobjects2 VARCHAR2 (32000);
v_INVALIDobjects1 VARCHAR2 (32000);
BEGIN
FOR v_cur
IN (SELECT DISTINCT object_type
FROM all_objects
WHERE object_type IN ('SYNONYM',
'PACKAGE BODY',
'TRIGGER',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'TYPE',
'VIEW'))
LOOP
v_stmt1 := 'select count(*) from all_objects where object_type ='''|| v_cur.object_type|| ''' AND owner=''SCOTTA'' ';
EXECUTE IMMEDIATE v_stmt1 INTO v_cnt1;
v_stmt2 := 'select count(*) from all_objects where object_type ='''|| v_cur.object_type|| ''' AND owner=''SCOTTB'' ';
EXECUTE IMMEDIATE v_stmt2 INTO v_cnt2;
IF NVL (v_cnt1, 0) != NVL (v_cnt2, 0)
THEN
DBMS_OUTPUT.PUT_LINE ( v_cur.object_type || ' = SCOTTA'|| ' --> ' || v_cnt1 || ' AND SCOTTB ' || ' --> ' || v_cnt2);
DBMS_OUTPUT.NEW_LINE;
END IF;
SELECT LISTAGG (OBJECT_NAME, ' , ') WITHIN GROUP (ORDER BY OBJECT_NAME DESC)
INTO v_missobjects1
FROM (SELECT OBJECT_NAME FROM all_objects WHERE object_type = v_cur.object_type AND owner = 'SCOTTB'
MINUS
SELECT OBJECT_NAME FROM all_objects WHERE object_type = v_cur.object_type AND owner = 'SCOTTA' );
IF v_missobjects1 IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE ( v_cur.object_type|| '(S) present in SCOTTB but not in SCOTTA: ' || v_missobjects1);
END IF;
SELECT LISTAGG (OBJECT_NAME, ' , ') WITHIN GROUP (ORDER BY OBJECT_NAME DESC)
INTO v_missobjects2
FROM (SELECT OBJECT_NAME FROM all_objects WHERE object_type = v_cur.object_type AND owner = 'SCOTTA'
MINUS
SELECT OBJECT_NAME FROM all_objects WHERE object_type = v_cur.object_type AND owner = 'SCOTTB' );
IF v_missobjects2 IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE ( v_cur.object_type|| '(S) present in SCOTTA but not in SCOTTB: ' || v_missobjects2);
END IF;
END LOOP;
select LISTAGG (OBJECT_NAME, ' , ') WITHIN GROUP (ORDER BY OBJECT_NAME DESC) INTO v_INVALIDobjects1 from all_objects where status <>'VALID' and owner= 'SCOTTB';
IF v_INVALIDobjects1 IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE ( 'Invalid objects in SCOTTB: ' || v_INVALIDobjects1);
END IF;
select LISTAGG (OBJECT_NAME, ' , ') WITHIN GROUP (ORDER BY OBJECT_NAME DESC) INTO v_INVALIDobjects2 from all_objects where status <>'VALID' and owner= 'SCOTTA';
IF v_INVALIDobjects2 IS NOT NULL
THEN
DBMS_OUTPUT.PUT_LINE ( 'Invalid objects in SCOTTA: ' || v_INVALIDobjects2);
END IF;
END;
/
EOF`
echo $Result1 >$log_dir/schemas_diff.log
下面是文件中的O/P:
VIEW = SCOTTB --> 3329 AND SCOTTG --> 3328 VIEW(S) present in SCOTTB but not in SCOTTG: V_EMP_SAL Invalid objects in SCOTTB: TR_TEST_56787 , TR_TEST_7868 , TR_TEST_1267 , TR_TEST_78687 , TR_TEST_SALARY_ADDITIONAL , TR_TEST_456 Invalid objects in B: TR_TEST_3324 , TR_TEST_3423 , TR_TEST_65756
我希望它是可读的格式:
VIEW = SCOTTB --> 3329 AND SCOTTG --> 3328
VIEW(S) present in SCOTTB but not in SCOTTG: V_EMP_SAL
Invalid objects in SCOTTB: TR_TEST_56787 , TR_TEST_7868 , TR_TEST_1267 , TR_TEST_78687 , TR_TEST_SALARY_ADDITIONAL , TR_TEST_456
Invalid objects in B: TR_TEST_3324 , TR_TEST_3423 , TR_TEST_65756
1条答案
按热度按时间41ik7eoe1#
您需要添加引号:
学习如何在shell中正确引用,这非常重要:
“双引号”每个包含空格/元字符和 every 扩展的文字:
"$var"
、"$(command "$var")"
、"${array[@]}"
、"a & b"
。使用'single quotes'
作为代码或文字$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
。看http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
when-is-double-quoting-necessary