我正在服务器上处理PBS队列。我想自动提交几个作业因此需要用路径替换变量。由于不可能将自变量放入正在运行与队列一起运行的脚本,我想替换通常使用的shell变量带有硬编码参数。
我需要的是:
#! /bin/sh
#PBS -N runme_$file
#PBS -o $file.out
#PBS -e $file..err
#PBS -q batch
#PBS -j oe
#PBS -m abe
#PBS -r n
#PBS -l nodes=1:ppn=1
#PBS -l walltime=24:00:00
/home/example/proggie script $file $parameter2
echo "DONE"
将$file替换为"/tmp/output",因此应将其转换为:
#! /bin/sh
#PBS -N runme_/tmp/output
#PBS -o /tmp/output.out
#PBS -e /tmp/output.err
#PBS -q batch
#PBS -j oe
#PBS -m abe
#PBS -r n
#PBS -l nodes=1:ppn=1
#PBS -l walltime=24:00:00
/home/example/proggie script /tmp/output $parameter2
/home/example2/proggie2 /tmp/output
echo "DONE"
PBS部分很重要,因为它阻碍了参数的使用。所以我不能只使用$1和$2并给脚本参数它需要通过论据。相反,我必须通过substitution命令,然后我可以将其提交给排队系统。我仍然希望能够使用命令行中的脚本,用于快速测试。
我已经尝试过使用sed,但可能会使用特殊字符文件中发生的事情把一切都搞砸了。必须有更好的方法。
使用sed
:
sed "s%$file%$file%" script.in > script.out
使用awk
(gawk
或GNU Awk):
awk '{ gsub(/$file/, file); print }' file="$file" script.in > script.out
在这两个例子中,我假设这个编辑上下文具有$file
中文件名的正确值。我还假设脚本中没有任何其他变量,例如$file1
或$filename
;如果您确实有这样的变量,那么正则表达式必须更加复杂。在sed
示例中,我还假设您没有在文件名中嵌入百分比符号。
如果将$file指定为${file}会怎样。那么你应该能够使用sed。当你说"特殊字符"时,我想你指的是其他$符号。至少这是我能在你发布的内容中看到的唯一内容。