将文件中的键/值参数读入 shell 脚本 [英] Reading key/value parameters from a file into a shell script

查看:29
本文介绍了将文件中的键/值参数读入 shell 脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的脚本几乎可以运行了.这样做的目的是从文件中获取定义的值,然后在运行时将这些值填充到 shell 脚本中.

I've got my script working almost. The goal of this is to take defined values from a file and then populate these valeus in a shell script at runtime.

请看看我这里有什么...

Please take a look at what i have here...

第一个文件:ab.sh

The first file: 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,其中定义了值并且应该来自...

This is the file Parameters.conf where the values are defined and should come from...

Parameters.conf

Parameters.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 变量 本身在变量中命名BashFAQ #6;关联数组也是如此.
  • 在读取键值时,重定向需要按照进行;做 ...;done 而不是 cat input |同时读取键值;做 ...;完成以避免错误 BashFAQ #24.
  • 实际的 sqlplus 调用不应该在循环内,因为循环体在文件中的每一行运行一次.由于您希望所有在运行sqlplus之前读取文件的所有行(以及分配的所有变量),循环应该在之前完全完成>sqlplus 被调用.
  • 使用前缀或关联数组可确保来自配置文件的变量无法覆盖系统环境变量,例如 PATHLD_PRELOAD.
  • Assignment to a shell variable which is itself named in a variable is described in BashFAQ #6; likewise for associative arrays.
  • The redirection needs to be done as while read key value; do ...; done <input rather than cat input | while read key value; do ...; done to avoid the bug BashFAQ #24.
  • The actual sqlplus calls shouldn't be inside the loop, because the loop body is run once per line in the file. Since you want all the file's lines to be read (and all the variables assigned) before running sqlplus, the loop should entirely complete before sqlplus is called.
  • Using either a prefix or an associative-array ensures that variables coming from the configuration file can't override system environment variables like 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

这篇关于将文件中的键/值参数读入 shell 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆