как "повесить" файл с помощью цикла для - PullRequest
0 голосов
/ 12 апреля 2020

Я начал с сценария bash, и я пытаюсь создать для l oop, который использует массив, в котором есть аргументы, переданные сценарию (2 или более файлов), пытаясь "зависнуть" с команда ">>", первые из которых "n-1" передают в качестве аргумента последний файл (n), записывая входные файлы в порядке справа налево

, например:

myscript.sh file1 file2 file3 file4

file4 будет содержать в последовательности file3 file2 file1

arr=($@)
j=$#-1
    for i in { j-1..0..1 }

  do 
         cat arr[i] >> $[j]

          done 

Я пытался сделать это таким образом, но это не работает, кто-то может мне помочь?

Ответы [ 3 ]

1 голос
/ 12 апреля 2020

Попробуйте:

#!/bin/bash
n=$#
for i in $(seq $((n - 1)) -1 1) ; do
  cat ${@:$i:1} >> ${@:$n:1}
done

Объяснение:

  1. seq $((n - 1)) -1 1 генерирует числа от $n - 1 до 1 в обратном порядке.
  2. ${@:$i:1} дает элемент $i массива аргументов скрипта.

Или без seq:

#!/bin/bash
n=$#
for ((i = n - 1; i; i--)) ; do
  echo "cat ${@:$i:1} >> ${@:$n:1}"
done

Или даже короче, с некоторым l oop вместо a для l oop и, возможно, выключено topi c по этой причине:

#!/bin/bash
i=${#}
while ((--i)) ; do
  echo "cat ${@:$i:1} >> ${@:$#:1}"
done
0 голосов
/ 12 апреля 2020

Вы можете напечатать все аргументы, кроме последнего, в отдельных строках, изменить порядок файлов, а затем поместить их все в файл, который является последним аргументом:

printf "%s\n" "${@:1:$#-1}" | tac | xargs cat > "${@: -1}"

То же самое, используя ноль в качестве разделитель потока:

printf "%s\0" "${@:1:$#-1}" | tac -s '' | xargs -0 cat > "${@: -1}"

Было бы очень желательно защитить от подсчета аргументов менее 2, потому что когда $# = 0, то ${@: -1} будет $0. Тогда $0 может быть вашей оболочкой с полным путем ex, как /bin/bash, поэтому > может перезаписать ваш исполняемый файл оболочки!

Так же:

if (($# >= 2)); then printf "%s\0" "${@:1:$#-1}" | tac -s '' | xargs -0 cat > "${@: -1}"; fi
0 голосов
/ 12 апреля 2020

Не уверен насчет "зависания", но это объединяет первые файлы с последним именем файла

cat "${@:0:$#}" > "${@: -1:1}"

это нарезка аргументов.

...