我的脚本已经差不多可以运行了。这样做的目的是从文件中获取定义的值,然后在运行时将这些值填充到 shell 脚本中。
请看看我这里有什么...
第一个文件:ab.sh
#!/bin/bash
USER_TYPE=$1 #IDENTIFY USER TYPE TYPE1,TYPE2,TYPE3,TYPE4
USERNAME=$2
PERMISSION_TYPE=$3 #IDENTIFY PERMISSION TYPE SELECT,UPDATE,DELETE,INSERT
TARGET_USER=$4
TARGET_TABLE=$5
if [ $USER_TYPE == 'TYPE1' ]
then
cat Parameters.conf |while read USERNAME
do
sqlplus / as sysdba << E00
CREATE USER ${USERNAME}
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
ALTER USER ${USERNAME} DEFAULT ROLE ALL;
GRANT CREATE SESSION TO ${USERNAME};
GRANT CONNECT TO ${USERNAME};
exit
E00
done
cat p.conf |while read PERMISSION_TYPE TARGET_SCHEMA TARGET_TABLE USERNAME
do
sqlplus / as sysdba > /home/o/output/output.log << E01
GRANT ${PERMISSION_TYPE} ON ${TARGET_USER}.${TARGET_TABLE} TO ${USERNAME};
E01
done
fi
这是定义值的文件Parameters.conf,这些值应该来自...
参数.conf
USER_TYPE TYPE1
USERNAME NEWUSER
PERMISSION_TYPE SELECT,UPDATE
TARGET_USER TESTUSER
TARGET_TABLE ABC
第一选择:关联数组
这需要 bash 4.0 或更高版本支持declare -A
;请参阅下文了解其他选项。
#!/bin/bash
# first, read your key/value pairs into shell variables
declare -A v=( )
while read -r var value; do
v[$var]=$value
done < Parameters.conf
# second, perform a command that depends on them
sqlplus / as sysdba << E00
CREATE USER ${v[USERNAME]}
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
ALTER USER ${v[USERNAME]} DEFAULT ROLE ALL;
GRANT CREATE SESSION TO ${v[USERNAME]};
GRANT CONNECT TO ${v[USERNAME]};
exit
E00
sqlplus / as sysdba > /home/o/output/output.log << E01
GRANT ${v[PERMISSION_TYPE]} ON ${v[TARGET_USER]}.${v[TARGET_TABLE]} TO ${v[USERNAME]};
E01
关键点:
- 对 shell 变量(其本身在变量中命名)的赋值在Bash常见问题解答#6 http://mywiki.wooledge.org/BashFAQ/006#Assigning_indirect.2Freference_variables;对于关联数组也是如此。
- 重定向需要完成为
while read key value; do ...; done <input
而不是cat input | while read key value; do ...; done
以避免错误Bash常见问题解答#24 http://mywiki.wooledge.org/BashFAQ/024.
- 实际上
sqlplus
调用不应该在循环内部,因为循环体在文件中每行运行一次。既然你想要all要读取的文件行(以及分配的所有变量)before跑步sqlplus
,循环应该在之前完全完成sqlplus
叫做。
- 使用前缀或关联数组可确保来自配置文件的变量不能覆盖系统环境变量,例如
PATH
or LD_PRELOAD
.
第二选择:前缀命名空间
#!/bin/bash
while read -r var value; do
printf -v "v_$var" %s "$value"
done <Parameters.conf
# second, perform a command that depends on them
sqlplus / as sysdba << E00
CREATE USER ${v_USERNAME}
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
ALTER USER ${v_USERNAME} DEFAULT ROLE ALL;
GRANT CREATE SESSION TO ${v_USERNAME};
GRANT CONNECT TO ${v_USERNAME};
exit
E00
sqlplus / as sysdba > /home/o/output/output.log << E01
GRANT ${v_PERMISSION_TYPE} ON ${v_TARGET_USER}.${v_TARGET_TABLE} TO ${v_USERNAME};
E01
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)