我正在编写一个 shell 脚本,它从另一个程序获取数据,我使用该变量值从文件中读取内容,并在开始和底部的这些数据中附加一些内容:
下面是一个例子:
readonly file_location=$location
readonly client_id = $id
readonly client_types = $type_of_client
这里 $location、$id 和 $type_of_client 值是从另一个程序传递的。下面是一个例子:
- $location 将是完整路径名,如下所示:
/home/david/data/12345678
- $id 将是数字:
120
- $type_of_client 将以空格分隔的单词:
abc def pqr
现在,在这个位置中,/home/david/data/12345678
我有这样的文件:abc_lop.xml
、def_lop.xml
和pqr_lop.xml
.含义_lop.xml
始终相同,因此我们可以对其进行硬编码。我们现在只需要迭代client_types
变量并创建一个如上所示的文件名,然后将整个文件读入字符串(或者如果有其他更好的方法,也可能是这样)。我的工作如下所示:
#!/bin/bash
readonly file_location=$location
readonly client_id=$id
readonly client_types=$type_of_client
for word in $client_types
do
echo $word
file_value=`cat "file_location"/"$word"_lop.xml`
echo $file_value
done
现在我需要做一些特殊的事情,比如在 shell 脚本中进行字符串操作,但我不知道如何做到这一点。现在,无论我们从这些文件中读取什么值,我都需要在我们正在读取的所有文件的顶部和底部附加一些内容。我需要做完全相同的事情,如下所示:
例如:如果abc_lop.xml
我们使用以下命令查看文件后,它是这样的vi
:
<Hello version="100">
<!-- some stuff here -->
</Hello>
我需要把它做成这样:
<hello_function>
<name>Data</name>
<Hello version="100">
<!-- some stuff here -->
</Hello>
</hello_function>
如您所见,我将其添加到顶部<hello_function><name>Data</name>
,并将其添加到底部</hello_function>
。我们如何在 shell 脚本中做到这一点?
所以一般来说echo $file_value
应该打印出上面每个附加值client_types
:
#!/bin/bash
readonly file_location=$location
readonly client_id=$id
readonly client_types=$type_of_client
for word in $client_types
do
echo $word
file_value=`cat "file_location"/"$word"_lop.xml`
// may be do something here?
echo $file_value // this should print out appended string value both at top and bottom.
done
每个 XML 文件肯定会小于 10MB。
答案1
如果您所做的只是输出数据,则无需读取变量。对于您的主循环:
for word in $client_types; do
echo "$word"
echo '<hello_function>'
echo '<name>Data</name>'
cat "$file_location/${word}_lop.xml"
echo '</hello_function>'
done
当然,这会输出所有修改文件的串联,以后可能很难分开。但它有效。
编辑:要输出到单独的文件:
for word in $client_types; do
fn="${word}"_new.xml
echo "$word"
echo '<hello_function>' >>"$fn"
echo '<name>Data</name>' >>"$fn"
cat "$file_location/${word}_lop.xml" >>"$fn"
echo '</hello_function>' >>"$fn"
done
当然,这取决于您想要在每个文件中包含什么内容。