bash:如何进行内联替换/扩展?

时间:2016-11-25 17:17:46

标签: bash shell

我运行一个脚本 ./script.sh,例如

./script config.txt 480

开具类似

的发票
command --crf "${crf##*=}"

它从配置文件中读取。配置文件包含几个参数,以模式命名:<parameter1><number>=<value>, e.g。

crf480=18.2
crf720=18.5
(…)

现在,我在剧本的开头加入了一些代码:

<An IFS that reads the config>
crf=$(cat "$config"|grep crf|grep $2)
qcomp=$(cat "$config"|grep qcomp|grep $2)
aqmode=$(cat "$config"|grep aqmode|grep $2)
…

所以使用./script config.txt 480 $ crf具有所需的值(crf480的值)。

我想在开始时避免使用那个长列表并进行内联替换/扩展,以便&#34; $ crf&#34;被扩展为&#34; $ crf480&#34;,取决于$ 2。 我花了一些时间在https://mywiki.wooledge.org/BashFAQ并在这里搜索了这个网站,但由于我不是母语,对bash知之甚少,所以我没有设法找到解决方案。

是否可以在bash中进行此类内联替换,如果可以,该怎么做?

1 个答案:

答案 0 :(得分:1)

只需阅读配置的每一行,并设置变量,如果后缀是您正在寻找的内容:

$ cat script
#!/bin/bash

suffix="$1"

# Read each name/value pair
while IFS="=" read -r name value
do
  # Check if the name ends with our chosen suffix
  if [[ $name == *"$suffix" ]]
  then
    # Set the variable name without the suffix
    declare "${name%"$suffix"}=$value"
  fi
done < config

echo "\$var contains $var"

如果config包含以下内容:

$ cat config
var480=four eighty
var720=seven twenty

您可以像这样运行脚本:

$ ./script 480
$var contains four eighty

$ ./script 720
$var contains seven twenty