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

时间:2017-06-23 07:48:27

标签: bash shell

我有以下代码:

#!/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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果文件中有多个此类键值对,并且只想过滤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"

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