2017-02-20 19 views
0

я создал свою основную переменную из команды чтения (я делал это вручную, так и с помощью скрипта):Как использовать переменную в команде, которая создает еще одну переменную

read NAME 

Затем я хочу использовать это NAME переменной для поиска файла и создать еще одну переменную:

STUDENT=$(grep $NAME <students.dat | awk -F: '/$NAME/ {print $1}') 

Если я выполнить команду вручную с реальным именем из этого students.dat файла (а не $ NAME), он выполняет и отображает то, что я хочу. Однако, когда я запускаю эту команду (вручную или из сценария с использованием $NAME), он возвращает пустое значение, и я не уверен, почему.

ответ

1

Переменные оболочки не интерполируются в одинарных кавычках, а только в двойных кавычках.

STUDENT=$(grep $NAME <students.dat | awk -F: "/$NAME/ {print \$1}") 

$1 должен быть экранированы, чтобы гарантировать, что это не расширяется за счет оболочки, но AWK.

+0

Передача значение '$ name' с' -V' вариант является более безопасным. – chepner

+0

Красивая! Так оно и было. Благодаря! – SuperheroSmith

+0

Лучше заключить $ NAME в двойные кавычки, переходя к 'grep'. Кроме того, используйте '--' для предотвращения сбоев, вызванных любыми ведущими' -' в $ NAME. Итак, 'grep -" $ NAME "' намного лучше. – codeforester

2

@ user1615415: Попытка:

cat script.ksh 
echo "Enter name.." 
read NAME 
STUDENT=$(awk -vname="$NAME" -F: '($0 ~ name){print $3}' student.dat)