Bash UNIX shell脚本执行循环执行命令
总的来说,我不明白如何使unixshell脚本中的大多数命令与直接从命令行(使用bash)执行的命令一样执行循环操作 作为一个简单的测试,使用名为looping.sh的脚本来执行SQL脚本(在这种情况下,filelist.txt中的内容并不重要): 导致 looping.sh:第2行:找不到SQL*Plus::命令 对于filelist.txt中的每一行。第二行上的其他变体不起作用,比如把它放在引号里等等 或者,如果filelist.txt有其他sh脚本的名称,那么让我们假设在本例中有一行名为_file1.sh,我想要执行它Bash UNIX shell脚本执行循环执行命令,bash,shell,loops,unix,Bash,Shell,Loops,Unix,总的来说,我不明白如何使unixshell脚本中的大多数命令与直接从命令行(使用bash)执行的命令一样执行循环操作 作为一个简单的测试,使用名为looping.sh的脚本来执行SQL脚本(在这种情况下,filelist.txt中的内容并不重要): 导致 looping.sh:第2行:找不到SQL*Plus::命令 对于filelist.txt中的每一行。第二行上的其他变体不起作用,比如把它放在引号里等等 或者,如果filelist.txt有其他sh脚本的名称,那么让我们假设在本例中有一行名为_
for i in $(cat filelist.txt)
do exec $i
done
导致
:未找到第2行:exec:调用了_file1.sh
这些文件都在同一个文件夹中。我尝试了第二行的变体,比如/bin/sh$I,将其放在引号中,等等。在do循环中执行命令的神奇方法是什么?$(…)
获取内容并将其作为命令运行,然后返回命令的输出
所以当你写作时:
for i in $(cat filelist.txt)
do $(sqlplus DB_USER/password@abc @test.sql)
done
shell在命中循环体时所做的是运行sqlplus DB\u USER/password@abc@test.sql
然后它从该命令(不管是什么)获取输出,并用它替换$(…)
位。因此,您最终得到了一个如下的循环(并非每次循环都会发生,但为了便于说明):
for i in $(cat filelist.txt)
do <output of 'sqlplus DB_USER/password@abc @test.sql' command>
done
在第二个示例中:
for i in $(cat filelist.txt)
do exec $i
done
您告诉shell,$i
中的文件名应该像二进制或可执行shell脚本一样执行
就你而言,这里发生了两件事。在$i
中找不到文件名,(这更难注意到)$i
中的文件名末尾包含回车符(可能是DOS行结束文件)。(这就是为什么错误消息比正常消息更混乱的原因。)(我真的很想知道这一点,因为我没有料到会从一个不带引号的$I
而是从一个带引号的“$I”
中看到这一点,但我可能只是错了。)
因此,在这种情况下,您需要从文件中删除回车符(有关详细信息,请参阅标记的“询问问题代码之前”部分的第1点),然后需要确保文件名是可执行脚本,并且具有正确的路径
哦,还有,exec
永远不会返回,所以循环将只执行一个文件
如果需要多次执行,请删除exec
这就是你所说的一切。有关如何正确(安全)读取文件中的行,请参阅。您的第一个示例是否打算引用
“$i”
?似乎没有,错误消息与命令不一致。@kojiro错误来自我们可以看到的命令输出的“命令”。
for i in $(cat filelist.txt)
do sqlplus DB_USER/password@abc @test.sql
done
for i in $(cat filelist.txt)
do exec $i
done