我正在使用 bash shell。我正在尝试编写一个脚本,该脚本将读取属性文件,然后根据它在文件中读取的键值对在另一个文件中进行一些替换。所以我有
#!/bin/bash
file = "/tmp/countries.properties"
while IFS='=' read -r key value
do
echo "${key} ${value}"
sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g' /tmp/country.rb
done < "$file"
但是当我去运行该文件时,我收到“Nno such file or directory error”,尽管我的文件存在(我在验证它之后执行了“ls”)。
localhost:myproject davea$ sh /tmp/script.sh
=: cannot open `=' (No such file or directory)
/tmp/countries.properties: ASCII text
/tmp/script.sh: line 9: : No such file or directory
localhost:myproject davea$
localhost:myproject davea$ ls /tmp/countries.properties
/tmp/countries.properties
我还需要做什么才能成功读取我的属性文件?
答案1
错误就在那里:
=: cannot open `=' (No such file or directory)
有东西正在尝试打开名为 的文件=
,但该文件不存在。
/tmp/script.sh: line 9: : No such file or directory
这通常在最后一个冒号之前有文件名,但由于它是空的,似乎有东西试图打开一个空名称的文件。
考虑这一行:
file = "/tmp/countries.properties"
file
这将运行带有参数=
和 的命令/tmp/countries.properties
。 (shell 不关心命令的参数是什么,可能有一些东西使用等号作为参数。)现在,file
碰巧是用于识别文件类型的程序,它就是这样做的。首先尝试打开=
,导致错误,然后打开/tmp/countries.properties
,告诉你它是什么:
/tmp/countries.properties: ASCII text
另一个No such file or directory
来自重定向< $file
。由于该变量未分配值,因此重定向将不起作用。
shell 中的赋值要求有不标志周围有空白=
,因此:
file=/tmp/countries.properties
也在这里:
sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g'
变量不会在单引号内扩展,并且您在整个第二个参数周围都包含变量,因此sed
将获得文字${key}
而不是变量的内容。
要么用单引号结束来扩展变量,要么只对整个字符串使用双引号:
sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g'
sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g"
答案2
尝试:
file="/tmp/countries.properties"