0

我有一个应该由 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

4 回答 4

1
my_rm() { rm -r `ls /test/$1 | awk ... | grep ... `; }
for i in `whatevr`; do
    my_rm $i
done;
于 2013-09-19T20:34:26.047 回答
0

做到这一点非常棘手,但可以做到:

for i in $(seq 0 100)
do
  str=str$i
  eval "eval \"\$$str\""
done
于 2013-09-19T20:39:53.993 回答
0

你也可以这样做:

for i in {0..10}
do
    <whatevercommand>
done
于 2013-09-19T21:03:44.413 回答
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
于 2013-09-19T21:11:40.873 回答