我制作了这样的剧本:
'\n'
echo命令工作并给出我想要的#! /usr/bin/bash
a=`ls ../wrfprd/wrfout_d0${i}* | cut -c22-25`
b=`ls ../wrfprd/wrfout_d0${i}* | cut -c27-28`
c=`ls ../wrfprd/wrfout_d0${i}* | cut -c30-31`
d=`ls ../wrfprd/wrfout_d0${i}* | cut -c33-34`
f=$a$b$c$d
echo $f
sed "s/.* startdate=.*/export startdate=${f}/g" ./post_process > post_process2
但是在文件post_process2中就像这个2008042118
并且无法调用变量f。我想生成像export startdate=
答案 0 :(得分:2)
首先 - 不要在这里使用ls
- 它在性能方面都很昂贵(与globbing相比,它是在shell内部执行而不启动任何外部程序),并且不保证有用输出所有可能的文件名making its use in this context inherently bug-prone。假设一个ksh派生的shell(如bash或zsh),从文件名中检索片段的更好方法如下所示:
#!/bin/bash
# this is an array, but we're only going to use the first element
file=( "../wrfprd/wrfout_d0${i}"* )
[[ -e $file ]] || { echo "No file found" >&2; exit 1; }
f=${file:22:4}${file:27:2}${file:30:2}${file:33:2}
其次,不要使用sed
来修改代码 - 这样做需要运行时用户有权修改自己的代码,而且还会引发注入漏洞。只需将您的内容写入数据文件:
printf '%s\n' "$f" >startdate.txt
...并且,在第二个脚本中,读取该文件中的值:
# if the shebang is #!/bin/bash
startdate=$(<startdate.txt)
# if the shebang is #!/bin/sh
startdate=$(cat startdate.txt)