Hoe voeg ik set -e toe aan alle standaard bashes?

Как вы и подозревали, у него есть синтаксис, но я также обнаружил некоторые другие проблемы и придумал версию, в которой просто отказано от использования 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 в этом текстовом примере, чтобы создать окончательную версию кода.

-1
01.02.2018, 21:42
0 ответов

Теги

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