bash:我怎样才能 assemble 字符串:`"filename=output_0.csv"`

bash: How can I assemble the string: `"filename=output_0.csv"`

我正在使用 bash 脚本来执行程序。该程序必须采用以下参数。 (程序是 gnuplot。)

gnuplot -e "filename='output_0.csv'" 'plot.p'

我需要能够 assemble 以下字符串:"filename='output_0.csv'"

我的计划是 assemble 字符串 STRING=filename='output_0.csv' 然后执行以下操作:gnuplot -r "$STRING" 'plot.p'。请注意,我在没有突出显示 Whosebug 语法样式的情况下留下了 STRING 一词,以强调我想要生成的字符串。

我不是特别精通bash,所以我不知道该怎么做。

我认为可以使用 STRING="$STRING"stuff to append to string 连接字符串?我认为这可能是必需的?

作为一个额外的复杂层,值 0 实际上是一个整数,每次程序 运行 时它应该递增 1。 (通过 for 循环完成。)如果我的程序中有 n=1,我如何用整数 n 的 "string value" 或文本版本替换字符串中的 0

将内容附加到现有字符串的最安全方法是包含波浪形括号和引号:

STRING="something"
STRING="${STRING}else"

您可以使用如下内容创建命令行的 "dynamic" 部分:

somevalue=0
STRING="filename='output_${somevalue}.csv'"

还有其他工具,例如 printf,可以处理更复杂的格式设置。

somevalue=1
fmt="filename='output_%s.csv'"

STRING="$(printf "$fmt" "$somevalue")"

关于你的"extra layer of complication",我认为这个增量必须以将值存储在程序外部某处的方式发生,否则你会能够使用 for 循环来处理事情。您可以为此使用临时文件:

#!/usr/bin/env bash

# Specify our counter file
counter=/tmp/my_counter

# If it doesn't exist, "prime" it with zero
if [ ! -f "$counter" ]; then
  echo "0" > $counter
fi

# And if it STILL doesn't exist, fail.
if [ ! -f "$counter" ]; then
  echo "ERROR: can't create counter." >&2
fi

# Read the last value...
read value < "$counter"

# and set up our string, per your question.
STRING="$(printf "filename='output_%d.csv'" "${value}")"

# Last, run your command, and if it succeeds, update the stored counter.
gnuplot -e "$STRING" 'plot.p' && echo "$((value + 1))" > $counter

一如既往,解决这个问题的方法不止一种。运气好的话,这将使您在阅读 bash 手册页和其他 Whosebug 问题时抢先一步,这将帮助您了解所需内容!

发布了一个答案,我以为我已经接受了,但由于某种原因它已被删除,可能是因为它没有完全回答问题。

我发布了另一个类似的问题,这个问题的答案也帮助我回答了这个问题。您可以在此处找到上述问题和答案: