第一大問題:$($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解決方案),都沒有工作。 –