2015-12-05 4 views
3

Я строю сценарий работает в #/bin/sh на модем работает вариант OpenWRT:Возвращение строковое значение * расширяется при возврате вызова

[email protected]:~# ls -l /bin/sh 
lrwxrwxrwx 1 root  root    7 Oct 15 2014 /bin/sh -> busybox 

Сценарий сбора и представления данных. Я столкнулся с проблемой. Мне нужно, чтобы вернуть строку в имя_компьютере подключен, это в пятой колонке:

[email protected]:~# cat /tmp/dhcp.leases 
1449374455 00:00:00:00:00:00 192.168.1.245 * 00:00:00:00:00:00 
1449371955 11:11:11:11:11 192.168.1.135 android-27718d96d947c125 11:11:11:11:11 

Вот как это должно работать:

[email protected]:~# printf '%s\n' $(grep -i 11:11:11:11:11 /tmp/dhcp.leases | awk {'printf $4'}) 
android-27718d96d947c125 

Однако, если подключенный компьютер не имеет сеть имя набора, она указана в качестве *:

[email protected]:~# printf '%s\n' $(grep -i 00:00:00:00:00:00 /tmp/dhcp.leases | awk {'printf $4'}) 
script2.sh 
test.sh 

После исполнения, * возвращается и расширен в качестве имен файлов в папке под управлением whic h приводит к сбою сценария. Это переписывается из вложенной функции, где входной файл представляет собой список MAC-адресов, по одному в каждой строке:

while read enhet; do 
    printf '%-6s%-32s%-5s%-19s%-4s%-16s%-20s%-4s%-3s\n' "Navn: " $(cat /tmp/dhcp.leases | grep -i $enhet | awk {'printf $4'}) "MAC: " $(cat /tmp/dhcp.leases | grep -i $enhet | awk {'printf $2'}) "IP: " $(cat /tmp/dhcp.leases | grep -i $enhet | awk {'printf $3'}) "Signalstyrke(RSSI):" $(wlctl rssi $enhet) "dBm"; 
done < temp_assoc 

Что мне нужно, чтобы вернуть * символ в виде строки, не расширяя его.

Можно ли это сделать в этом контексте? С уважением

+0

Пожалуйста, обратите внимание на [редактирование-помощь] (http://stackoverflow.com/editing-help). – Cyrus

+1

Спасибо за головы. Я думаю, что теперь он гораздо читабельнее. –

+0

Я слишком ленив прямо сейчас, но я предполагаю, что с помощью «$ ()» вместо простой $ (<большой материал в трубке>) мог бы выполнить эту работу. Возможно, вам придется поиграть, где поставить дополнительные двойные кавычки. –

ответ

3

Результат замены команды зависит от расширения имени пути. Вы должны процитировать его, чтобы символы, такие как *, рассматривались как подстановочные знаки.

printf '%s\n' "$(grep -i 00:00:00:00:00:00 /tmp/dhcp.leases | awk {'printf $4'})" 

Кроме того, ваш grep | awk немного из антипаттерн:

awk '/00:00:00:00:00:00/ {print $4}' /tmp/dhcp.leases 
Смежные вопросы