第一大问题:$($2) $line
本身执行$2
作为命令,然后尝试与$line
作为参数传递给它运行它的输出(如果有的话)作为另一个命令。你只需要$2 $line
。
第二大问题:while read ... done < $(ls $1)
不会从文件名列表中读取,它会尝试输出ls指定的文件内容 - 根据具体情况,这会以任何方式失败。进程替换(while read ... done < <(ls $1)
)会做或多或少的你想要的,但它是一个仅限bash的功能(即你的必须启动脚本#!/bin/bash
而不是#!/bin/sh
)。无论如何这对parse ls是一个坏主意,你应该几乎总是使用shell glob(*
)代替。
该脚本还有一些其他潜在的问题与文件名空间(使用$line
没有双引号周围,等),怪异的风格怪异(你不需要;
在shell行中的末尾)。这里是我的刺在改写:
#! /bin/sh
if [ $# -ne 2 ]; then
echo "Usage: $0 <dir> <command to execute>"
exit 1
fi
for file in "$1"/*; do
$2 "$file"
done
echo "All done"
注意,我没把周围$2
双引号。这允许您指定多字命令(例如,./myscript thisDir "cat -v"
将被解释为运行带有-v
选项的cat
命令,而不是尝试运行名为"cat -v"
的命令)。将第一个参数之后的所有参数作为命令及其参数,实际上会更灵活一些,从而可以让您./myscript thisDir cat -v
,等:
#! /bin/sh
if [ $# -lt 2 ]; then
echo "Usage: $0 <dir> <command to execute> [command options]"
exit 1
fi
dir="$1"
shift
for file in "$dir"/*; do
"[email protected]" "$file"
done
echo "All done"
尝试'EVAL “$ 2”' - http://www.linuxquestions.org/questions/programming-9/bash-script-passing-command-as-string-476664/ –
@DavidStarkey嗯,我试过'eval'(以及下面建议的与'eval'有关的pther解决方案),都没有工作。 –