动态运行linux shell命令

时间:2013-09-19 20:30:18

标签: linux bash shell

我有一个应该由shell脚本执行的命令。

实际上,命令对于进一步执行命令和正确转义关键部分非常重要。

通常在putty中执行的命令是这样的(可能是ls的一些额外标志)

rm -r `ls /test/parse_first/ | awk '{print $2}' | grep trash`

但现在我有一批这样的命令,所以我想在循环中执行它们

喜欢

for i in {0..100}
 do
    str=str$i
    ${!str}
 done

其中str是:

str0="rm -r `ls /test/parse_first/ | awk '{print $2}' | grep trash`"
str1="rm -r `ls /test/parse_second/ | awk '{print $2}' | grep trash`"

这给我带来了很多麻烦,因为$ {!str}执行的操作会在`...`标记

之间制动引号和内联shell

4 个答案:

答案 0 :(得分:1)

my_rm() { rm -r `ls /test/$1 | awk ... | grep ... `; }
for i in `whatevr`; do
    my_rm $i
done;

答案 1 :(得分:0)

实现这一目标非常棘手,但可以做到:

for i in $(seq 0 100)
do
  str=str$i
  eval "eval \"\$$str\""
done

答案 2 :(得分:0)

你也可以这样做:

for i in {0..10}
do
    <whatevercommand>
done

答案 3 :(得分:0)

将它们放在数组上并使用glob模式实际上更简单:

#!/bin/bash

shopt -s nullglob

DIRS=("/test/parse_first/" "/test/parse_second/")

for D in "${DIRS[@]}"; do
    for T in "$D"/*trash*; do
        rm -r -- "$T"
    done
done

如果rm可以接受多个参数,则不需要额外的循环:

for D in "${DIRS[@]}"; do
    rm -r -- "$D"/*trash*
done

更新:

#!/bin/bash

readarray -t COMMANDS <<'EOF'
rm -r `ls /test/parse_first/ | awk '{print $2}' | grep trash
rm -r `ls /test/parse_second/ | awk '{print $2}' | grep trash
EOF

for C in "${COMMANDS[@]}"; do
    eval "$C"
done

或者你可以从另一个文件中读取命令:

readarray -t COMMANDS < somefile.txt