Ваш синтаксис испорчен. Я предполагаю, что вы хотите
#!/bin/bash
echo "config system admin" >output.txt
sed -n '/bash/s/:.*//p' /etc/passwd |
while read -r uname; do
if [ "$uname" = "root" ]; then
echo "skipping '$uname'" >&2
else
cat <<____
edit $uname
set remote-auth enable
set trusthost1 8.8.8.8 255.255.255.255
set accprofile "admin"
set vdom "root"
set remote-group "foobar"
set password ENC potatoes
next
____
fi
done >>output.txt
Вероятно, вы пытались ввести \n
(не /n
), чтобы указать буквальный перевод строки, но строка уже содержит все необходимые новые строки.
Я провел рефакторинг, чтобы избежать бесполезного cat
и бесполезного grep
, но основные исправления c syntacti c, вероятно, более важны, если вы только изучают основы.
Использование cat
с здесь-документом вместо echo
, вероятно, не является решающим изменением здесь, но упрощает загадку вложенного цитирования, в которую вы попадаете.
Если (как указано в комментарии) вы хотите пропустить многих пользователей, а не только root
, возможно, переключитесь на оператор case
:
while read -r uname; do
case $uname in
"root" | "fred" | "barney" | "dino")
echo "skipping '$uname'" >&2;;
*)
cat <<____;;
...
____
esac
done
Этот синтаксис сначала выглядит сбивающим с толку, но он не опасно, просто отличается от того, как выглядит большинство других языков. Случай *
похож на else
в предыдущем скрипте, и каждая ветвь должна заканчиваться двойной точкой с запятой.