подстановка переменных в CLI и для циклов

[118954] Я бы просто пропустил это через второе [119372]grep[119373], чтобы удалить их: [12187] [119374]-v[119375] меняет соответствие, печатая строки, которые не соответствуют шаблону, а [119376]-P[119377] включает Perl-совместимые регулярные выражения, которые позволяют использовать [119378]- отрицательные lookbehinds[119379]. Этот конкретный регекс, будет соответствовать [119380].js[119381], то есть [119382], а не [119383], заданный [119384] отладкой [119385], что означает (поскольку мы инвертируем совпадения), что будут распечатаны только те файлы [119386].js[119387]. Однако, как указал @QuestionOverflow в комментариях, это может привести к нежелательному побочному эффекту фильтрации строк [119388], которые содержат [119390]OK[119391] и [119392]js[119393], поскольку [119394]grep -v[119395] применяется ко всему выходному файлу, а не только к имени файла. Чтобы избежать этого, просто добавьте двоеточие (это то, что [119396]grep[119397] использует для отделения имени файла от содержимого файла):[12189]Это все равно не сработает, если Ваша строка ввода содержит [119398]foo.js:[119399] или если Ваше имя файла содержит [119400]:[119401]. Поэтому используйте другой подход: [12190]-T[119402]-T[119403] заставляет [119404]grep[119405] распечатать закладку между именем файла и его содержимым. Поэтому, если мы просто добавим [119406]-T[119407] в конец регекса, она будет совпадать только с именами файлов, а не с содержанием строки.[12191] Тем не менее, [119408] с помощью [119546] найдет [12192], возможно, будет иметь больший смысл, не смотря ни на что.[118965].
2
16.01.2015, 00:47
2 ответа

Вам нужно eval:

for ((i=0; i < $1; ++i)); do 
    echo "iterator=$i"; 
    # for debugging
    echo eval "$3"
    eval "$3"
done

, конечно, вы должны обратить внимание на правильную цитату в командной строке. Ваш пример LS * $ (($ 2 + $ I)) *. GNU | WC -L опасно в этом смысле, потому что переменные ссылки решаются в «, то есть до прогона скрипта. Вам нужны одиночные кавычки:

doNtimes.sh 10 0 'ls *$(($2 + $i ))*.gnu | wc -l'
1
27.01.2020, 22:21
yes _do | head -n 10 | 3<&0 0>&- \
<<\INIT sh -s -- my args
    alias _do='echo these are "$@."'
    exec <&3 3>&- 
#END
INIT

Вы также можете заставить скорлупу подать довольно легко. xargs тоже сработает.

OUTPUT:

these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
these are my args.
0
27.01.2020, 22:21

Теги

Похожие вопросы