Ajax-hook - это lib с открытым исходным кодом для привязки глобального объекта XMLHttpRequest и изменения запроса AJax по умолчанию и ответа. github: https://github.com/wendux/Ajax-hook , например:
hookAjax ({// hook callbacks onreadystatechange: function (xhr) { console.log ("onreadystatechange called:% O", xhr)}, onload: function (xhr) {console.log ("onload called:% O", xhr)}, // функция hook open: function (arg, xhr ) {console.log ("open called: method:% s, url:% s, async:% s", arg [0], arg [1], arg [2])}})
Если вы хотите использовать одну переменную и выполнить с ней действие, вам просто нужно использовать один цикл:
for file in 4 5 6 7 8
do
paste "${file}_1" "${file}_2"
done
Это будет делать
paste 4_1 4_2
paste 5_1 5_2
...
Я согласен с ответом, предложенным в настоящее время fedorqui в контексте заданного в настоящее время вопроса. Ниже дается только предоставление более общих ответов.
Еще один общий подход (для bash 4.0 или newer) заключается в том, чтобы сохранить ваши пары в ассоциативном массиве:
declare -A pairs=( [4_1]=4_2 [5_1]=5_2 [6_1]=6_2 [7_1]=7_2 [8_1]=8_2 )
for i in "${!pairs[@]}"; do
j=${pairs[$i]}
paste "$i.txt" "$j.txt" >"${i}.${j}.txt"
done
Другой (совместимый со старыми версиями bash) заключается в использовании более одного обычного массива:
is=( 4_1 5_1 6_1 7_1 8_1 )
js=( 4_2 5_2 6_2 7_2 8_2 )
for idx in "${!is[@]}"; do
i=${is[$idx]}
j=${js[$idx]}
paste "$i.txt" "$j.txt" >"$i.$j.txt"
done
Существует общий шаблон, в котором у вас есть пары файлов, где одно имя пары может быть легко получено из другого. Если файл, которому вы знаете, является X, а другой - Y, у вас есть следующие общие случаи использования.
Все они относятся к одному и тому же скелету с коротким кодом.
for x in path/to/base*.ext; do
dir=${x%/*} # Trim trailing file name, keep dir
base=${x##*/} # Trim any leading directory
# In this case, $y has a different subdirectory and a different extension
y=${dir%/to}/from/${base%.ext}.newext
# Maybe check if y exists? Or doesn't exist?
if [ -e "$y" ]; then
echo "$0: $y already exists -- skipping" >&2
continue
fi
mv or ffmpeg or awk or whatever "$x" and "$y"
done
Ключевым моментом здесь является наблюдение, что y
может быть получен из x
с некоторыми простыми заменами переменных. Итак, вы перебираете значения x
и вычисляете соответствующее значение y
внутри цикла.
Здесь мы использовали встроенные операторы ${variable#prefix}
и ${variable%suffix}
оболочки для возврата значение переменной с любым ведущим prefix
или конечным suffix
, соответственно, обрезано. (Существует также ##
и %%
, чтобы соответствовать самому длинному, а не кратчайшему возможному совпадению. Выражение после #
или %
является обычным шаблоном шаблона оболочки.) Обычно это должно быть все, что вам нужно, хотя вы часто видите скрипты sed
или awk
даже для этого тривиального задания (где на самом деле вы обычно должны стараться избегать внешнего процесса), а также, конечно, для более требовательных преобразований.
Если вы нужно зацикливать файлы x
, разбросанные по разным каталогам, возможно, цикл должен начинаться с чего-то вроде
find dir1 dir2 etc/and/so/forth -type f -name 'x-files*.ext' -print |
while IFS='' read -r x; do
:
Обычно встречающаяся проблема в подобных вопросах - это ответы, которые не приводят цитаты $x
и $y
правильно. Как правило, любая переменная, содержащая имя файла, всегда должна быть в двойных кавычках.
Если X и Y не связаны друг с другом, общим решением является цикл над документом, содержащим это отображение:
while read -r x y; do
: stuff with "$x" and "$y"
done <<'____HERE'
first_x_value first_y_value
another_x corresponding_y
random surprise
____HERE
Вы можете использовать словарь / hashMap:
animals=(dog cat mouse)
declare -A sound=(
[dog]=barks
[cat]=purrs
[mouse]=cheeps
)
declare -A size=(
[dog]=big
[cat]=medium
[mouse]=small
)
for animal in "${animals[@]}"; do
echo "$animal ${sound[$animal]} and it is ${size[$animal]}"
done
Таким образом, вы можете работать с кортежами (парами), «тройками» и т. д. - любыми данными о словаре / хэш-карте.
Кредиты: Основная идея взята из ответа великого @ CharlesDuffy.
paste "${file}"_{1,2}
– rici 25 February 2015 в 19:33printf '%s %s\n' {4..8}_{1,2} | xargs -I cmd paste cmd
– user 24 November 2015 в 17:38xargs
по некотируемым значениям быстро сокращается, если у вас есть нетривиальные имена файлов, которые требуют цитирования или экранирования. – tripleee 21 January 2018 в 11:15