繁体   English   中英

Linux Shell Scritping-带有命令的变量内部变量

[英]Linux Shell Scritping - Variable inside variable with commands

我正在尝试创建一个脚本来自动设置和安装Kubernetes主节点的进程。 我无法弄清楚下面的代码有什么问题,因为目标设置工人节点信息太简单了。

因此,让我分享我的代码段代码。

function create_worker()
{

  echo "Generate the Kubernetes Worker Keypairs ...";

  WORKER_NUMBER=3
  WORKERS_FQDN=("worker1" "worker2" "worker3")
  WORKERS_IP=("192.168.0.10" "192.168.0.11" "192.168.0.12")
  MASTER_IP=("192.168.0.20")
  K8S_SERVICE_IP=10.3.0.1

  for ((i=0; i <= $WORKER_NUMBER; i++));
  do
     openssl genrsa -out ${WORKERS_FQDN[i]}-worker-key.pem 2048
     WORKER_IP="${WORKERS_IP[i]}" openssl req -new -key "${WORKERS_FQDN[i]}"-worker-key.pem -out "${WORKERS_FQDN[i]}"-worker.csr -subj "/CN="${WORKERS_FQDN[i]}"" -config worker-openssl.cnf
     WORKER_IP="${WORKERS_IP[i]}" openssl x509 -req -in "${WORKERS_FQDN[i]}"-worker.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out "${WORKERS_FQDN[i]}"-worker.pem -days 365 -extensions v3_req -extfile worker-openssl.cnf
    echo ${WORKERS_IP[i]}  ${WORKERS_FQDN[i]}
    sleep 2;
  done

  echo "Done ...";

  create_adminkey

}

这是输出:

+ WORKER_IP=
+ openssl req -new -key -worker-key.pem -out -worker.csr -subj /CN= -config worker-openssl.cnf
Error Loading request extension section v3_req
139752372545168:error:220A4076:X509 V3 routines:a2i_GENERAL_NAME:bad ip address:v3_alt.c:476:value=
139752372545168:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:v3_conf.c:95:name=subjectAltName, value=@alt_names
+ WORKER_IP=
+ openssl x509 -req -in -worker.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out -worker.pem -days 365 -extensions v3_req -extfile worker-openssl.cnf
Error Loading extension section v3_req
140642872743568:error:220A4076:X509 V3 routines:a2i_GENERAL_NAME:bad ip address:v3_alt.c:476:value=
140642872743568:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:v3_conf.c:95:name=subjectAltName, value=@alt_names

我无法读取其他变量中的变量值并无法在该变量中执行命令。

有什么办法可以帮助我吗?

谢谢

您无需说是在循环的第一次迭代还是最后一次迭代中看到该错误。 根据您对Shell脚本的了解,我假设使用后者。

如果我将您的脚本简化为:

echo "Generate the Kubernetes Worker Keypairs ..."

WORKER_NUMBER=3
WORKERS_FQDN=("worker1" "worker2" "worker3")
WORKERS_IP=("192.168.0.10" "192.168.0.11" "192.168.0.12")
MASTER_IP=("192.168.0.20")
K8S_SERVICE_IP=10.3.0.1

for ((i=0; i <= $WORKER_NUMBER; i++)); do
    echo WORKER_IP="${WORKERS_IP[i]}"
done

echo "Done ...";

我看到作为输出:

Generate the Kubernetes Worker Keypairs ...
WORKER_IP=192.168.0.10
WORKER_IP=192.168.0.11
WORKER_IP=192.168.0.12
WORKER_IP=
Done ...

最后一次迭代(其中WORKER_IP=显示任何值)是由于循环中的错误比较。 你有:

for ((i=0; i <= $WORKER_NUMBER; i++)); do

这将迭代值0、1、2和3。您的列表只有三个值,分别是${WORKERS_IP[0]}${WORKERS_IP[2]} 没有${WORKERS_IP[3]} 将循环更改为:

for ((i=0; i < $WORKER_NUMBER; i++)); do

...而且事情应该按预期进行。

现在,说了这一点,您可以通过执行以下操作使事情更易于管理:

for WORKER_IP in "${WORKERS_IP[@]}"; do
    echo WORKER_IP="$WORKER_IP"
done

这不需要跟踪$WORKERS_IP的长度。

我找到了解决方法,并按照下面的解决方法进行操作。

  function create_worker()
  {

    echo "Generate the Kubernetes Worker Keypairs ...";

    WORKER_NUMBER=2
    WORKERS_FQDN=("worker1" "worker2" "worker3")
    WORKERS_IP=("192.168.0.10" "192.168.0.11" "192.168.0.12")
    MASTER_IP=("192.168.0.20")
    K8S_SERVICE_IP=10.3.0.1

    for ((i=0; i <= "$WORKER_NUMBER"; i++));
    do
      echo "${WORKERS_IP[i]}" --- "${WORKERS_FQDN[i]}";
      openssl genrsa -out "${WORKERS_FQDN[i]}"-worker-key.pem 2048
      WORKER_IP="${WORKERS_IP[i]}" openssl req -new -key "${WORKERS_FQDN[i]}"-worker-key.pem -out "${WORKERS_FQDN[i]}"-worker.csr -subj "/CN="${WORKERS_FQDN[i]}"" -config worker-openssl.cnf
      WORKER_IP="${WORKERS_IP[i]}" openssl x509 -req -in "${WORKERS_FQDN[i]}"-worker.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out "${WORKERS_FQDN[i]}"-worker.pem -days 365 -extensions v3_req -extfile worker-openssl.cnf
      sleep 2;
    done

现在一切正常。

谢谢大家

亲切的问候,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM