Как вы и подозревали, у него есть синтаксис, но я также обнаружил некоторые другие проблемы и придумал версию, в которой просто отказано от использования xargs
в целом в пользу цикла для
: строка
#!/bin/bash
U3=/home/user3/
NF1=/home/user3/mynewfile
File=(grades mynewfile mynewfile1 mynewfile2)
mkdir -p /home/user3/{CIT/{tests,grades},MyStuff/{Tests,Labs},NOS};
echo /etc/hosts.allow > $NF1;
for i in "${File[@]}"; do
cp $NF1 $U3/$i
done
cp $NF1 $U3/CIT/grades/${File[2]}
mkdir
была упрощена, чтобы удалить ненужные завершающие косые черты, mkdir
по-прежнему создает каталоги с конечной косой чертой или без нее, поэтому нет необходимости в больше набора текста Причины остальных изменений:
Во-первых, при тестировании нескольких строк исходного кода:
$ U3=/home/user3/
$ File=(grades mynewfile mynewfile1 mynewfile2)
$ echo $U3/CIT/grades/${File[2]}
/home/user3//CIT/grades/mynewfile1
Путь, сохраненный в $ U3
, был установлен с косой чертой в конце, то строка $ U3 / CIT / grades / $ {File [2]}
также имеет косую черту после $ U3
, что заставляет bash расширить его до / home / user3 // CIT / grades / mynewfile1
, это проблема, потому что двойная косая черта //
не то же самое, что /
, cp
например может пожаловаться на отсутствие такого файла или директора y
.
Итак, если вы имели в виду одинарную косую черту /
, рекомендуется просто установить $ U3
так, чтобы в первую очередь не было завершающей косой черты:
$ U3=/home/user3
$ File=(grades mynewfile mynewfile1 mynewfile2)
$ echo $U3/CIT/tests/${File[2]}
/home/user3/CIT/tests/mynewfile1
Теперь это приводит к правильный путь, без лишних косых черт.
После исправления следующей ошибки была следующая:
$ echo $U3/CIT/tests/${File[*]}
/home/user3/CIT/tests/grades mynewfile mynewfile1 mynewfile2
Я предполагаю, что вы намеревались расширить имена файлов в массиве File
, используя / home / user3 / CIT / tests
как общий префикс, что-то вроде этого расширения фигурных скобок с запятыми:
$ echo tweedle{dum,dee}
tweedledum tweedledee
В этой форме раскрытия фигурных скобок
{
либо до, либо после }
или обоих, что вы правильно сделали слово
, запятая ,
другое слово и т. д. $ {File [*]}
, я еще не видел, чтобы он работал с содержимым массива таким образом Вместо этого, чтобы вывести список, состоящий из объединения одного и того же общего начального слова или строка ( $ U3
) плюс другая часть, которая отличается на основе массива ( $ File
), я рекомендую цикл для
:
$ for i in "${File[@]}"; do
> echo $U3/$i
> done
Обратите внимание, что вы не вводите >
, bash автоматически предоставил это для ind Укажите продолжение строки. В сценарии у вас есть только:
for i in "${File[@]}"; do
echo $U3/$i
done
Результат всегда
/home/user3/grades
/home/user3/mynewfile
/home/user3/mynewfile1
/home/user3/mynewfile2
для i в "$ {File [@]}"; do
, цитата ( "
) плюс @
важны для того, чтобы цикл for
правильно понимал каждое имя файла в $ File
массив как отдельные аргументы. В конечном итоге цель состоит в том, чтобы скопировать один файл, на который ссылается переменная $ NF1
, в несколько мест, определяемых как расширением $ U3
, так и ] $ File
массив плюс $ U3 / CIT / tests / $ {File [2]}
Лучшая практика для проведения теста с помощью echo и команды, которую вы собираетесь выполнить, в данном случае cp
, так что вы можете видеть, что будет запущено, если вы не хотите использовать set
. Итак, сначала для нашего теста:
$ NF1=/home/user3/mynewfile
Затем
$ for i in "${File[@]}"; do
> echo cp $NF1 $U3/$i
> done
cp /home/user3/mynewfile /home/user3/grades
cp /home/user3/mynewfile /home/user3/mynewfile
cp /home/user3/mynewfile /home/user3/mynewfile1
cp /home/user3/mynewfile /home/user3/mynewfile2
Также кажется, что вы хотели скопировать в $ U3 / CIT / grades / $ {File [2]}
, чтобы не забыть об этом, но добавьте его как дополнительную строку:
$ echo cp $NF1 $U3/CIT/grades/${File[2]}
cp /home/user3/mynewfile /home/user3/CIT/grades/mynewfile1
cp
, которые будут запускаться xargs
аналогичных к исходному коду, но на самом деле это связано с дополнительным набором текста, поэтому мы избегаем этого Итак, просто удалите echo
в этом текстовом примере, чтобы создать окончательную версию кода.