每次调用脚本时在文件的下一行返回值。 MIDI 命令行音序器
Posted
技术标签:
【中文标题】每次调用脚本时在文件的下一行返回值。 MIDI 命令行音序器【英文标题】:return values in next line in file on every invocation of script. MIDI Command line sequencer 【发布时间】:2021-02-17 00:02:09 【问题描述】:所以我有一个文件“scenes.txt”,包含一组 2 列数字,总共约 500 行:
0 01
6 22
5 03
4 97
7 05
3 98
2 99
9 00 etc...
第一列范围是 0-9,第二列范围是 0-99。这 2 个字段是制表符分隔的。 在每次调用 shell 脚本时,我希望脚本将列表中下一行的 2 个数字的集合输出到 2 个变量。
所以如果我第一次运行脚本,var1 应该是 0,var2 应该是 01,下次运行脚本时,var1 应该是 6,var2 应该是 22,以此类推... 这些值将发送到 sendmidi 命令https://github.com/gbevin/SendMIDI,以通过 MIDI 控制硬件。 你可以称它为笨拙的 MIDI 命令行音序器。
到目前为止我尝试了什么:我创建了一个 bash 脚本“test1”:
#!/bin/bash
read LINECNT < pointer
echo "next line to be processed: $LINECNT"
VAR1=$(sed "$LINECNTq;d" scenes.txt)
echo "Line and Variables: $LINECNT: $VAR1"
# here the actual magic happens:
/usr/local/bin/sendmidi dev "USB2.0-MIDI Anschluss 2" cc 32 $VAR1 PC $VAR2
((LINECNT++))
echo $LINECNT > pointer
还有另一个名为“pointer”的文件,它只保存下次调用时要输出的值的指针位置。
文件指针:
1
这会导致:
[dirk@dirks-MacBook-Pro] ~
❯ ./test2
next line to be processed: 1
Line and Variables: 1: 0 01
[dirk@dirks-MacBook-Pro] ~
❯ ./test2
next line to be processed: 2
Line and Variables: 2: 6 22
[dirk@dirks-MacBook-Pro] ~
❯ ./test2
next line to be processed: 3
Line and Variables: 3: 5 03
[dirk@dirks-MacBook-Pro] ~
❯ ./test2
next line to be processed: 4
Line and Variables: 4: 4 97
[dirk@dirks-MacBook-Pro] ~
❯ ./test2
next line to be processed: 5
Line and Variables: 5: 7 05
我的问题:
“scenes.txt”的每一行都有两个值,但是
VAR=$(sed "$LINECNTq;d" scenes.txt)
行仅给出具有两个值的整行。
我尝试了几个“剪切”修改,像这样
VAR1=cut -f1 - $(sed "$LINECNTq;d" scenes.txt)
VAR2=$(cut -f2 $(sed "$LINECNTq;d" scenes.txt))
但没有运气... 如何将该行中的两个值推送到 VAR1 和 VAR2 中?
【问题讨论】:
请尝试:read -r VAR1 VAR2 < <(sed -n "$LINECNTp" scenes.txt)
。顺便说一句,环境变量和内部 shell 变量都是大写的。所有其他变量名应为小写。
【参考方案1】:
您的sed
命令不正确。此外,可以使用单个 read
命令读取变量:
#!/bin/bash
read -r linecnt < pointer
read -r var1 var2 < <(sed "$linecnt!d; q" scenes.txt)
/usr/local/bin/sendmidi dev "USB2.0-MIDI Anschluss 2" cc 32 "$var1" PC "$var2"
echo $((linecnt + 1)) > pointer
我将您的变量名称更改为小写,因为按照惯例,大写的变量是环境变量和内部 shell 变量。
【讨论】:
【参考方案2】:IFS='\t'
arr=($VAR1)
/usr/local/bin/sendmidi dev "USB2.0-MIDI Anschluss 2" cc 32 $arr[0] PC $arr[1]
【讨论】:
虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,您也可能会得到用户的积极反馈/赞成。以上是关于每次调用脚本时在文件的下一行返回值。 MIDI 命令行音序器的主要内容,如果未能解决你的问题,请参考以下文章