循环中简单的命令执行 - bourne shell脚本

时间:2010-08-07 19:32:25

标签: bash shell

我有一个名为inp.txt的文件,其中列出了3个目录名

#!/bin/sh
while read dirname
do
        echo $dirname
        "ls -l" $dirname
done < inp.txt

当我运行上述内容时,我收到此错误:

line 5: ls -l: command not found

如果我只做“ls”而不是“ls -l”,它就可以了。我在这里缺少什么?

3 个答案:

答案 0 :(得分:7)

摆脱引号。

while read dirname
do
        echo "$dirname"
        ls -l "$dirname"
done < inp.txt

当你有引号时,你会说,“把它视为一个单词。” shell查找名为ls -l的可执行文件,而不是将参数-l传递给命令ls

Nitpicker注意:如果您想正确使用引号,请在"$dirname"周围添加引号。 否则,如果你有一个名为“音乐文件”的目录,名称中有空格,没有引号,你的脚本会将其视为两个目录名称并打印如下:

ls: Music: No such file or directory
ls: Files: No such file or directory

答案 1 :(得分:1)

您应该删除ls -l周围的引号。

答案 2 :(得分:1)

shell将空间解释为参数分隔符。通过在某些内容引用引号,可以强制shell将其视为一个参数。执行时,shell将第一个参数解释为要执行的命令。在这种情况下,您告诉它执行名为“ls -l”的命令,不带参数,而不是带有参数“-l”的“ls”。