我有一个 bash 代码,它接受输入文件,处理它并显示输出文件。但是,我希望代码在目录中的所有特定扩展名 (.wfx) 文件上运行。假设我有1,2,3.....100.wfx文件(100个.wfx文件)并且我想一次性获得输出。原始的 bash 脚本(删去了很多 grep、awk 和 seds)看起来像这样,
system_name="1"
wfxfile=${system_name}.wfx
.
.
.
echo "id1 id2 " > ${system_name}_energies.txt
由于上面的代码运行良好,所以我不想更改它。该脚本的名称是 extract_value.sh。我在想如果我可以用 for 循环将变量“system_name”作为输入文件名,我就可以实现目标。所以我对剧本做了很少的改动
system_name="$i"
wfxfile=${system_name}.wfx
我正在尝试类似的事情,
for i in *.wfx; do system_name="{$i}"; echo $system_name; ./extract_value.sh;done
我得到的是这个
10_1.wfx
grep: .wfx: No such file or directory
10_2.wfx
grep: .wfx: No such file or directory
10.wfx
grep: .wfx: No such file or directory
11_1.wfx
grep: .wfx: No such file or directory
11_2.wfx
grep: .wfx: No such file or directory
1_1.wfx
grep: .wfx: No such file or directory
11.wfx
grep: .wfx: No such file or directory
12_1.wfx
grep: .wfx: No such file or directory
12_2.wfx
grep: .wfx: No such file or directory
1_2.wfx
grep: .wfx: No such file or directory
这个问题看起来肯定是在循环中不正确地使用变量。但是,我们感谢任何帮助。
答案1
您必须export
从外壳中获取变量,使其在您运行的 shell 进程的环境中可见;或将其作为命令行参数传递。未导出的 Shell 变量仅在同一 shell 实例内可见。
例如 mytest.sh:
#!/bin/sh
echo "cmdline arg: '$1', envvar: '$sysname'"
进而:
for i in abc def ghi; do
export sysname="$i"
./mytest.sh "$i"
done
您也可以只使用sysname="$1" ./mytest.sh
将sysname
变量传递到内部脚本的环境没有将其设置在外壳中。
答案2
既然你对剧本做了一个小改动,我可以建议另一个吗?
换线
system_name="$i"
到
system_name="$1"
然后做循环
for i in *.wfx; do
[[ ! -f "${i}" ]] && break
./extract_value.sh "${i}"
done
检查-f
是针对不存在此类文件的情况:shell 会将 i 设置为*.wfx
字面意思。循环和脚本中的核心更改是传递文件名并将其接受为第一个位置参数。