2013-12-04 3 views
0

Я пытаюсь создать файлы профиля .remmina для каждого из моих серверов в соответствии с моим/etc/hosts, я написал следующий скрипт, но моя проблема в том, что в результате команды sed, где я ожидал увидеть значение переменной $hostname вместо этого я вижу слово $ hostname, как это можно сделать правильно?Как использовать переменную в выходе sed?

#!/bin/bash 
num=100 
for srv in `cat ~/srv.lst`; 
    do cp 1.remmina $num.remmina 
    hostname=grep $srv /etc/hosts | awk -F" " '{print $2}' 
    sed -i 's/name=amavm4/name=$hostname/g' ~/.remmina/$num.remmina 
    sed -i 's/server=amavm4:5906/server=$hostname:5906/g' ~/.remmina/$num.remmina 
    num=$((num+1)) 
done 

Таким образом, после ваших ответов, я отредактировал сценарий выглядеть так:

#!/bin/bash 
num=1392344753668 
for srv in `cat ~/srv.lst`; 
    do cp 1.remmina $num.remmina 
    hostname=`grep $srv /etc/hosts | awk -F" " '{print $2}'` 
    sed -i 's/name=amadw1/name='$hostname'/g' ~/.remmina/$num.remmina 
    sed -i 's/server=amadw1:5906/server='$hostname':5906/g' ~/.remmina/$num.remmina 
    num=$((num+1)) 
done 

Но тогда, когда я запускаю его я получаю следующие ошибки:

[email protected]:~/.remmina$ ./rem_add_srv 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 31: unterminated `s' command 
sed: -e expression #1, char 40: unterminated `s' command 
sed: -e expression #1, char 25: unterminated `s' command 
sed: -e expression #1, char 34: unterminated `s' command 
sed: -e expression #1, char 22: unterminated `s' command 
sed: -e expression #1, char 31: unterminated `s' command 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 28: unterminated `s' command 
sed: -e expression #1, char 37: unterminated `s' command 
sed: -e expression #1, char 24: unterminated `s' command 
sed: -e expression #1, char 33: unterminated `s' command 
sed: -e expression #1, char 26: unterminated `s' command 
sed: -e expression #1, char 35: unterminated `s' command 
sed: -e expression #1, char 25: unterminated `s' command 
sed: -e expression #1, char 34: unterminated `s' command 
[email protected]:~/.remmina$ 

It похоже, я получаю только 20 ошибок, в то время как скрипт создает до 87 файлов, почему я получаю эту ошибку?

+0

Это __FAQ__. Используйте __double quotes__. – devnull

+0

Помимо использования двойных кавычек, вы также можете сделать это так: 'sed -i 's/name = amavm4/name =' $ hostname '/ g'' – ray

+0

Просто замените одинарные кавычки двойными кавычками в командах' sed' в вашем исходный код (тот, с которого вы начали). – devnull

ответ

0

Вы должны обеспечить две вещи:

  1. Скорлупа переменная должна быть оценена с помощью оболочки; поэтому он должен быть заключен в двойные кавычки, а не в одинарные кавычки. Кроме того, использование его вне кавычек (ваша текущая версия) обескураживается, потому что тогда символы в значении оцениваются оболочкой, а такие вещи, как пробелы, становятся маркерами-разделителями и т. Д. Поэтому вы должны использовать эту версию:

    sed -i " с/имя = amadw1/имя хоста = $/г»~/.remmina /„$ Num“.remmina

  2. значение переменной не должна содержать новой строки, потому что sed может обрабатывать только однострочные значения в его команде s. Я предполагаю, что ваша команда grep производит более одной строки, awk изменяет каждый из них, поэтому результат все еще многострочный. Чтобы избежать этого, рассмотрите, какая из нескольких строк является той, которую вы хотите использовать. Может быть, первый? Тогда просто использовать head -1:

    имя хоста = grep $srv /etc/hosts | head -1 | awk -F" " '{print $2}'

+0

itaig @ itaig-lt: ~ $ hostname =' grep 192.168.57.230/etc/hosts | awk -F "" '{print $ 2}' ' itaig @ itaig-lt: ~ $ echo $ hostname Itai-test --- выход - это имя хоста, это однострочный вывод из одного слова –

0
#!/bin/bash 
num=1392344753668 
cat ~/srv.lst | while read srv 
do 
    cp 1.remmina ${num}.remmina 
    sed -n "/${srv}/ s/^[^[:blank:]]\{1,\}[[:blank:]]\{1,\}\([^[:blank:]]\{1,\}\).*/\1/p;s/$/ void/" /etc/hosts | read hostname Ignore 
    if [ -n "${Ignore}" ] 
    then 
     sed -i "s/name=amadw1/name=${hostname}/g" ~/.remmina/$num.remmina 
     sed -i "s/server=amadw1:5906/server=${hostname}:5906/g" ~/.remmina/$num.remmina 
     let num+=1 
    else 
     echo "Bad hostname for srv: ${srv}" >&2 
    fi 
done 

работа в KSH, думаю, это тоже нормально в Баш. просто убедитесь, что имя хоста не содержит "&" "\ 1" -> "\ 9" (normaly not)

+1

' read' не будет иметь никакого эффекта; переменные, считанные в трубах, действительны только в этом трубе, а не снаружи. Вместо 'x | прочитайте y', вы можете использовать 'read y <<(x)', хотя, возможно, это сработает. – Alfe

+0

Извините, не знаю, что в bash это поведение отличается от ksh, спасибо за информацию – NeronLeVelu

Смежные вопросы