我试图从包含句点(.)的shell脚本中读取属性文件角色如下:

# app.properties
db.uat.user=saple user
db.uat.passwd=secret


#/bin/sh
function pause(){
   read -p "$*"
}

file="./app.properties"

if [ -f "$file" ]
then
    echo "$file found."
 . $file

echo "User Id " $db.uat.user
echo "user password =" $db.uat.passwd
else
    echo "$file not found."
fi

我试图在获取文件后解析该文件,但由于密钥包含"."而无法工作字符,该值中也有空格.

我的属性文件始终位于脚本的同一目录或/usr/share/doc中的某个位置

推荐答案

由于(Bourne)shell变量不能包含点,所以可以用下划线替换它们.读每一行,翻译.关键在于u和判断.

#/bin/sh

file="./app.properties"

if [ -f "$file" ]
then
  echo "$file found."

  while IFS='=' read -r key value
  do
    key=$(echo $key | tr '.' '_')
    eval ${key}=\${value}
  done < "$file"

  echo "User Id       = " ${db_uat_user}
  echo "user password = " ${db_uat_passwd}
else
  echo "$file not found."
fi

请注意,以上只是翻译.为了uu,如果你有一个更复杂的格式,你可能需要使用额外的翻译.我最近不得不解析一个完整的Ant属性文件,其中包含很多讨厌的字符,我必须使用:

key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')

Linux相关问答推荐

从一个文件中读取文件名并将文件名和内容存储到另一个带有|的文件中作为分隔符

ShellScript,有更好的方法来查找具有特定名称和日期的文件吗?

如何添加Linux格式的时间输出

删除一行和它之前的一行

`std::cout` 是如何实现的?

根据其他列的值创建一个新列

问题:Virtio rpmsg 总线 virtio0:收到的 msg 没有收件人 - 在 Yocto Hardknott - imx7d-pico

Linux合并文件

如何忽略 diff 命令中的一些差异?

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

为什么这个命令会杀死我的 shell?

size_t 和 off_t 的用法有什么区别?

将 bash 脚本添加到路径

./studio.sh 之后的 Android Studio 错误

发出信号并中断比较

如何在没有空格的情况下打印 awk?

Linux SCHED_OTHER、SCHED_FIFO 和 SCHED_RR - 区别

用curl编译php,curl安装在哪里?

Ionic android 构建错误 - 找不到ANDROID_HOME环境变量

如何通过命令行识别特定的 Linux 风格?