我有以下代码:
#!/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
非常感谢任何帮助。
答案 0 :(得分:1)
如果文件中有多个此类键值对,并且只想过滤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"
这可以假设你只有 属性文件中的两行,如图所示。如果需要,您可以在调用实际脚本之前打印主机和端口的值。