【发布时间】:2016-12-22 05:47:12
【问题描述】:
我的脚本几乎可以运行了。这样做的目的是从文件中获取定义的值,然后在运行时将这些值填充到 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,应该来自...
Parameters.conf
USER_TYPE TYPE1
USERNAME NEWUSER
PERMISSION_TYPE SELECT,UPDATE
TARGET_USER TESTUSER
TARGET_TABLE ABC
【问题讨论】:
-
不要为你自己的变量使用全大写的名称——这会使它们与操作系统和 shell 定义的环境变量冲突,这些变量仅限于该命名空间(例如,有一个
USER预设在你在这里覆盖的 bash 中)。请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/…,第四段,了解围绕环境变量名称的 POSIX 约定(以及扩展的 shell 变量名称,因为它们共享一个命名空间)。 -
我实际上没有在脚本中使用的 USER 变量。哎呀
-
当然;也就是说,重点更多是关于约定——如果您使用
user或username而不是USER或USERNAME,则您无需监管您的操作系统或shell 是哪些特定变量或没有设置和是否有冲突。 -
...顺便说一句,这将与哪个版本的 bash 一起运行?从 4.0 开始,有可用的关联数组功能,因此我们可以将从文件中读取的变量保存在与 shell 变量完全不同的命名空间中。如果需要与其他版本兼容,可以使用前缀或后缀来实现相同的效果。
标签: bash if-statement while-loop do-while