假设我想执行该命令ls
十次(尽管这是毫无意义的,因为它只会显示目录内容十次),是否有相当于编写以下内容:
for (i = 0, i < 10, i++) {
ls
}
现在,假设我想执行 Java 程序十次,每次使用不同的输入文件。是否有与以下内容等效的代码:
fileList = [input1, input2, ....., input10]
for (i = 0, i < 10, i++) {
java myProgram fileList[i]
}
我猜想有某种语言可以让我编写此类脚本。我尝试在网上查找,但我的知识很基础,找不到任何我能理解的内容。
答案1
是的!您可以使用 BASH 来解释您在终端中输入的命令。
例如,尝试这个:
for file in {input1,input2,input3}; do java myprogram $file; done
这一行代码是一个简单的循环,它将myprogram
与 java 一起在文件列表上运行。
这 100% 相当于运行:
java myprogram input1
java myprogram input2
java myprogram input3
您可以将此语法与任何您喜欢的命令一起使用。例如,您可以使用以下命令列出主目录中的所有文件:
for file in ~/*; do echo $file; done
~/*
将扩展为目录中所有文件的列表~
(隐藏文件除外)。
另一个例子:如果你想在 100 个文件上运行你的程序,你不需要手动列出它们。试试这个:
for i in $(seq 1 100); do java myprogram input$i; done;
$(seq 1 100)
将扩展为命令的输出seq 1 100
,它提供从 1 到 100 的数字列表。这样,您的程序将在所有 100 个“inputN”文件上运行。
在循环中使用多个命令也是可以的,但使用多行会更方便。以下示例将在 10 个测试输入上运行您的程序,并打印与参考输出的差异:
for i in $(seq 1 10); do
java myprogram input$i > temp_out
diff temp_out output$i
done
随着脚本的不断增长,将其保存到文件中很快就会变得方便。写下你的脚本(通常 bash 脚本会有.sh
扩展名),然后使用以下命令运行它:
sh myscript.sh
或者,如果你在 myscript 文件上设置 +x 标志,并将其放在#!\bin\sh
脚本的顶部(表明该文件应该使用 bash 运行):
./myscript.sh
答案2
这种语言就是您要绑定命令的程序。
这命令行提示由壳.Ubuntu 的默认 shell 是猛击(你应该从教程并查阅手册以供参考)。
要连续执行多个相关命令,可以使用环形. 您可以将文件名列表存储在大批多变的。
file_list=(input1 input2 … input10)
for file in "${file_list[@]}"; do
java myProgram "$file"
done
我使用过的语法元素:
- 数组变量赋值:(周围没有空格)
variable=(element1 element2 element3)
=
- 使用数组变量:(是的,由于历史原因,这很奇怪)
"${variable[@]}"
- 使用字符串变量:
"$variable"
- For 循环:(相当于换行符)
for variable in list; do instructions; done
;