0

シェル スクリプトで実行するコマンドがあります。

実際には、コマンドは重要な唯一のことではなく、さらにコマンドを実行し、重要な部分を適切にエスケープします。

通常パテで普通に実行されるコマンドはこんな感じです(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} によって行われる実行は、引用符と `...` マークの間のインラインシェルにブレーキをかけます

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 {0..10}
do
    <whatevercommand>
done
于 2013-09-19T21:03:44.413 に答える
0

これを正しく行うのは驚くほどトリッキーですが、実行できます。

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

実際には、それらを配列に配置してグロブ パターンを使用する方が簡単です。

#!/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 に答える