如何在shell脚本中调用字符串

时间:2016-06-04 22:43:59

标签: shell

我制作了这样的剧本:

'\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=

这样的行

1 个答案:

答案 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)