我是bash shell脚本的新手,非常感谢能够执行此任务的脚本的建议。我有一个包含许多行的文件(list.cqt)。每行都有一个以“/”分隔的字段列表,格式如下: /字段1 /字段2 /字段3 /字段4 /字段5 /字段6 /字段7 /字段8 /字段9 /字段10
例如list.cqt中的内容是:
/ F11 / F12 / F13 / F14 / F15 / F16 / F17 / F18 / F19 / F110
/ F21 / F22 / F23 / F24 / F25 / F26 / F27 / F28 / F29 / F210
...
/ Fx1 / Fx2 / Fx3 / Fx4 / Fx5 / Fx6 / Fx7 / Fx8 / Fx9 / Fx10
(我修改了每个字段中的名称只是为了简化问题。每行中只有字段数是常量。每个字段中的内容可以是任何东西 - 数字,字符等)
我需要编写一个脚本来通过读取list.cqt中的每一行来执行以下命令:
命令arg1 arg2 arg3 arg4 * arg5 * arg6 arg7 arg8 arg9 arg10
每行只读取 arg4 , arg5 , arg7 和 arg10 。休息都保持不变。
arg4 是list.cqt中该行的Field4
arg5 是list.cqt中该行的Field6
对于第一个命令, arg7 基本上以-1000开始,并以100为增量进行更改。因此对于第二个命令,第二个命令将为-900,依此类推,第11个命令为0,第12个命令为100命令,第13命令200等
arg10 与 arg7 的绝对值相同,但符号相反。因此,如果 arg7 为-600,则 arg10 为600.如果 arg7 为400,则 arg10 为-400。
例如,在上面的文件示例中从list.cqt读取前两行,命令为:
命令arg1 arg2 arg3 F14 F16 arg6 -1000 arg8 arg9 1000
命令arg1 arg2 arg3 F24 F26 arg6 -900 arg8 arg9 900
谢谢!
答案 0 :(得分:3)
您可以通过内部字段分隔符read
控制shell的IFS
命令的分隔符。如果您读入数组,则可以轻松访问索引值。然后,循环输入和更新计数器变量变得很简单。如果将参数保存到数组中,则只需将展开的数组作为参数传递给命令。
#!/bin/bash
# Use set -x to see if the array "args" is getting assigned the values you expect.
IFS='/'
counter=-1000
while read -a fields; do
(( counter+=100 ))
args=(
'arg1' 'arg2' 'arg3'
"${fields[4]}" "${fields[6]}" 'arg6'
$counter 'arg8' 'arg9' $(( -1 * counter ))
)
# command "${args[@]}"
done < list.cqt
答案 1 :(得分:2)
我在命令之前添加了echo
,因为最好检查生成的列表是否正确:
arg7=-1000
arg10=1000
while read line
do
set $(echo $line | tr / ' ')
echo command arg1 arg2 arg3 "$4" "$6" arg6 "$arg7" arg8 arg9 "$arg10"
arg10=$((arg10-100))
arg7=$((arg7+100))
done < list.cqt
如果是,只需删除echo
并运行脚本。
这里你逐行处理list.cqt
并将其部分行设置为shell的位置参数;然后将此部分用作$4
和$6
。每次处理arg10
文件中的行时,变量arg7
和list.cqt
都会增加/减少。
<强>更新强>
您也可以使用数组而不是位置参数(感谢Dennis Williamson和kojiro的提示):
arg7=-1000
arg10=1000
while IFS=/ read line
do
echo command arg1 arg2 arg3 "${line[4]}" "${line[6]}" arg6 "$arg7" arg8 arg9 "$arg10"
arg10=$((arg10-100))
arg7=$((arg7+100))
done < list.cqt
这使代码更快更清洁。