expr:从另一个脚本调用脚本并传递从文件读取的参数时的非数字参数



我有以下代码:

#!/bin/bash
PROP_FILE="${HOME}/my-prop.properties"
getProperty() {
        echo `cat ${PROP_FILE} | grep ${1} | cut -d'=' -f2`
}
PORT=$(getProperty "PORT")
HOSTS=$(getProperty "HOSTS")
#PORT=myPort
#HOSTS=myHosts
echo ${PORT}
echo ${HOSTS}
EXE="${HOME}/server/bin/my-executable.sh"
bash ${EXE} start -p ${PORT} -h ${HOSTS}

现在,当我运行此shell脚本时,它给了我一个错误:expr: non-numeric argument。如果我对值进行硬编码(显示为注释代码(,它可以工作。

以下是 my-prop.properties:

PORT=myPort
HOSTS=myHosts

任何帮助将不胜感激。

如果文件中有多个这样的键值对,并且只想过滤PORTHOST进行进程替换,如下所示

#!/usr/bin/env bash
propFile="${HOME}/my-prop.properties"
scriptPath="${HOME}/server/bin/my-executable.sh"
while read -r port; read -r  host; do 
    bash "$scriptPath" start -p "$port" -h "$host"
done < <(awk -F= '$1=="PORT" || $1=="HOSTS"{print $2}' "$propFile")

仅当属性文件中存在这两个键值对时,以下内容才有效。

为什么要绕圈子的方法来完成这么简单的任务。您可以在bash通过属性文件的输入重定向和=设置IFS来执行此操作,只需读取包含主机和端口值的第二个单词。

#!/usr/bin/env bash
propFile="${HOME}/my-prop.properties"
scriptPath="${HOME}/server/bin/my-executable.sh"
while IFS== read -r _ port; IFS== read -r _ host; do 
    bash "$scriptPath" start -p "$port" -h "$host"
done < "$propFile"

这在假设属性文件中只有两行的情况下工作,如下所示。如果需要,您可以在调用实际脚本之前打印主机和端口的值。

最新更新