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