Выберите строки на основе строк над ними

Проверьте маршрут по умолчанию (мой выглядит так):

$ ip route
default via 10.0.0.1 dev em0
10.0.0.0/24 dev em0  proto kernel  scope link  src 10.0.0.120

Это скажет вам, какое устройство используется и какой IP-адрес. Что касается IP-адреса, который будет видеть yahoo.com, это зависит от вашего подключения через провайдера, но простой способ - использовать простую веб-службу, такую как http://whatismyipaddress.com/

Для большинства случаев этого будет достаточно.

1
10.08.2018, 20:28
2 ответа

Первая строка скрипта — это строка «шебанг». Он сообщает ядру (программному загрузчику ), какую программу запускать для интерпретации сценария. Ваш сценарий пытается запустить себя для интерпретации сценария, который, в свою очередь, вызывает себя для интерпретации интерпретатора, и так до бесконечности.

Когда вы запускаете скрипт с помощью bash filename, ядро ​​не вызывается, а bash используется для запуска скрипта, который работает.

Поставить

#! /bin/bash

на первую строку и все будет хорошо.

Кстати, создайте пользователя с ограниченными правами для экспериментов с системой. Как root, вы можете легко уничтожить все, что не подлежит ремонту.

10
27.01.2020, 23:10

choroba очень хорошо объяснил , что ваша проблема связана с тем, что сценарий оболочки использует себя в качестве интерпретатора вместо bash.

Вот предложение по повторной реализации вашего скрипта, которое

  1. Не содержит синтаксических ошибок(dirFocus = ""является, например, синтаксической ошибкой в ​​том, что =не должно иметь пробелов вокруг себя в присваивании ).

  2. Работает с именами файлов, содержащими пробелы и символы новой строки. (Зацикливание вывода lsдисквалифицирует любое такое имя файла, аналогично wc -wполучит неверный подсчет, если какое-либо имя файла содержит пробелы ).

  3. Использует современный синтаксис оболочки($[ $i + 1 ]устарел bashсинтаксис ).

  4. Представлено незначительное улучшение вывода (добавлено (dir)к именам каталогов ).

#!/bin/bash

shopt -s dotglob    # make wildcards match hidden names by default
shopt -s nullglob   # make wildcards expand to nothing if no match

count=0
for name in "${1:-.}"/*; do
    count=$(( count + 1 ))
    if [ -d "$name" ]; then
        printf '%d : %s (dir)\n' "$count" "${name##*/}"
    else
        printf '%d : %s\n' "$count" "${name##*/}"
    fi
done

Это также не расширяет список файлов более одного раза, тогда как ваш код выполняет lsдля всего каталога для каждого имени в каталоге.

${1:-.}означает «использовать то, что находится в $1, если оно не пусто или не установлено, в противном случае используйте .».

${name##*/}означает "строка в $name, но без бита до последнего /".

4
27.01.2020, 23:10

Теги

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