我有以下代码:
#!/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
任何帮助将不胜感激。
如果文件中有多个这样的键值对,并且只想过滤PORT
,HOST
进行进程替换,如下所示
#!/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"
这在假设属性文件中只有两行的情况下工作,如下所示。如果需要,您可以在调用实际脚本之前打印主机和端口的值。