Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash UNIX shell脚本执行循环执行命令_Bash_Shell_Loops_Unix - Fatal编程技术网

Bash UNIX shell脚本执行循环执行命令

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脚本的名称,那么让我们假设在本例中有一行名为_

总的来说,我不明白如何使unixshell脚本中的大多数命令与直接从命令行(使用bash)执行的命令一样执行循环操作

作为一个简单的测试,使用名为looping.sh的脚本来执行SQL脚本(在这种情况下,filelist.txt中的内容并不重要):

导致

looping.sh:第2行:找不到SQL*Plus::命令

对于filelist.txt中的每一行。第二行上的其他变体不起作用,比如把它放在引号里等等

或者,如果filelist.txt有其他sh脚本的名称,那么让我们假设在本例中有一行名为_file1.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