gpt4 book ai didi

bash - 将文件中的键/值参数读取到 shell 脚本中

转载 作者:行者123 更新时间:2023-11-29 09:12:50 25 4
gpt4 key购买 nike

我的脚本几乎可以正常工作了。这样做的目的是从文件中获取定义的值,然后在运行时将这些值填充到 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 变量的赋值本身在变量中命名BashFAQ #6 中描述。 ;同样适用于关联数组。
  • 重定向需要作为while read key value; do ...; done <input来完成而不是 cat input | while read key value; do ...; done避免错误 BashFAQ #24 .
  • 实际sqlplus调用不应在循环内,因为循环体在文件中每行运行一次。由于您希望在运行 sqlplus 之前 读取文件的所有行(以及分配的所有变量) ,循环应该在 sqlplus 之前完全完成被称为。
  • 使用前缀或关联数组可确保来自配置文件的变量不会覆盖系统环境变量,如 PATHLD_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

关于bash - 将文件中的键/值参数读取到 shell 脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com