我一直在尝试编写一个可执行脚本来创建包含多个变量的文件。
这里,x
从 1 到 25 变化,z 从 5 到 7,步长为 0.1,而y
和w
是常数。因此,对于的每个值x
,必须有 21 个文件。我尝试了下面的方法,但我不明白这种嵌套的 for 循环应该如何工作。
mkdir dir
for ((i=1;i<=25;i++)); do
printf 'x=%s\ny=4\n' "$i"
for ((j=5;j<=7;j=j+0.1));do
printf 'z=%s\nw=4\n' "$j" > dir/diles_$i_$j.txt
done
另外,我怎样才能使其成为可执行文件?我正在使用 Ubuntu。
答案1
这是您的解决方案:
#! /bin/bash
mkdir dir
for ((i=1;i<=25;i++)); do
printf 'x=%s\ny=4\n' "$i"
for ((j=50;j<=70;j++));do
t=$(bc <<< "scale=1; $j/10")
printf 'z=%s.1f\nw=4\n' "$t" > dir/diles_$i\_$t.txt
done
done
解释 :
- Bash 工作原理仅有的使用整数,因此您不能使用浮点数/小数进行循环(您会看到我下面只使用了 10 的除法)
- 我们使用
bc
命令,将整数运算(例如除法)转换为浮点数;scale
运算符显示我们想要的小数位数(这里,1 就足够了,不会有很多0
,就像bc -l
do 一样) - 我们需要在文件名中添加一个
\\
,因为它没有考虑到i
命名文件
另外,我指出您的第一个printf
命令只是在终端中打印这样的结果,可能您会将它们添加到每个文件内(而不是终端显示),因此在这种情况下您必须使用下面的代码:
#! /bin/bash
mkdir dir
for ((i=1;i<=25;i++)); do
for ((j=50;j<=70;j++));do
t=$(bc <<< "scale=1; $j/10")
printf 'x=%s\ny=4\n' "$i" > dir/diles_$i\_$t.txt
printf 'z=%s.1f\nw=4\n' "$t" >> dir/diles_$i\_$t.txt
done
done
注意:>>
操作符或第二个printf
命令在这里很重要(第一个命令printf
并不重要,只取决于你是否要处理以前的数据 - >>
-,或者不 - >
),因为如果你只使用一个>
操作数,你将会删除所有以前的数据(所以第一个命令的输出printf
将被删除)
资料来源: