Беспроводная карта не соединится сразу же

POSIX

Для нормализации наклонных черт во всех параметрах я буду использовать вращающийся прием аргумента: сдвиг $1 прочь, преобразуйте его и поместите результат в конце списка параметров. Если Вы делаете это столько же время, сколько существуют параметры, Вы преобразовали все параметры, и у Вас есть они назад в порядке.

Для второй части кода я изменил Вашу логику, чтобы менее сбивать с толку: внешний цикл выполняет итерации по параметрам, и внутренний цикл выполняет итерации по компонентам контура. for x; do … done выполняет итерации по позиционным параметрам, это - удобная идиома. Я использую совместимый POSIX способ соответствовать строке против шаблона: case создать.

Протестированный с тире 0.5.5.1, pdksh 5.2.14, удар 3.2.39, удар 4.1.5, ksh 93 +, zsh 4.3.10.

Примечание стороны: кажется, существует ошибка в ударе 4.1.5 (не в 3,2): если шаблон случая "${common_path%/}"/*, один из тестовых сбоев.

posix_path_common () {
  for tmp; do
    tmp=$(printf %s. "$1" | tr -s "/")
    set -- "$@" "${tmp%.}"
    shift
  done
  common_path=$1; shift
  for tmp; do
    while case ${tmp%/}/ in "${common_path%/}/"*) false;; esac; do
      new_common_path=${common_path%/*}
      if [ "$new_common_path" = "$common_path" ]; then return 1; fi
      common_path=$new_common_path
    done
  done
  printf %s "$common_path"
}

удар, ksh

Если Вы находитесь в ударе (или ksh), можно использовать массивы — я не понимаю, почему Вы, кажется, ограничиваете себя позиционными параметрами. Вот версия, которая использует массив. Я должен признать, что это не особенно более ясно, чем версия POSIX, но это действительно избегает начальной буквы n^2 перестановка.

Для части нормализации наклонной черты я использую конструкцию ksh93 ${foo//PATTERN/REPLACEMENT} создайте для замены всех случаев PATTERN в $foo REPLACEMENT. Шаблон +(\/) для соответствия одному или нескольким режут; под ударом, shopt -s extglob должен быть в действительности (эквивалентно, запустите удар с bash -O extglob). Конструкция set ${!a[@]} устанавливает позиционные параметры на список нижних индексов массива a. Это обеспечивает удобный способ выполнить итерации по элементам массива.

Для второй части, я та же логика цикла как версия POSIX. На этот раз я могу использовать [[ … ]] так как все оболочки, предназначенные здесь, поддерживают его.

Протестированный с ударом 3.2.39, колотите 4.1.5, ksh 93 +.

array_path_common () {
  typeset a i tmp common_path new_common_path
  a=("$@")
  set ${!a[@]}
  for i; do
    a[$i]=${a[$i]//+(\/)//}
  done
  common_path=${a[$1]}; shift
  for tmp; do
    tmp=${a[$tmp]}
    while [[ "${tmp%/}/" != "${common_path%/}/"* ]]; do
      new_common_path="${common_path%/*}"
      if [[ $new_common_path = $common_path ]]; then return 1; fi
      common_path="$new_common_path"
    done
  done
  printf %s "$common_path"
}

zsh

К сожалению, zsh недостает ${!array[@]} функция для выполнения ksh93 версии как есть. К счастью, zsh имеет две функции, которые делают первую часть бризом. Можно индексировать позиционные параметры, как будто они были @ массив, таким образом, нет никакой потребности использовать промежуточный массив. И zsh имеет итеративную конструкцию массива: "${(@)array//PATTERN/REPLACEMENT}" выполняет замену шаблона на каждом элементе массива в свою очередь и оценивает к массиву результатов (смутно, Вам действительно нужны двойные кавычки даже при том, что результатом являются несколько слов; это - обобщение "$@"). Вторая часть чрезвычайно неизменна.

zsh_path_common () {
  setopt local_options extended_glob
  local tmp common_path new_common_path
  set -- "${(@)@//\/##//}"
  common_path=$1; shift
  for tmp; do
    while [[ "${tmp%/}/" != "${common_path%/}/"* ]]; do
      new_common_path="${common_path%/*}"
      if [[ $new_common_path = $common_path ]]; then return 1; fi
      common_path="$new_common_path"
    done
  done
  printf %s "$common_path"
}

Тесты

Мои решения минимально тестируются и комментируются. Я изменил синтаксис Ваших тестовых сценариев для парсинга под оболочками, которые не имеют $'…' и отказы отчета более удобным способом.

do_test () {
  if test "$@"; then echo 0; else echo $? "$@"; failed=$(($failed+1)); fi
}

run_tests () {
  function_to_test=$1; shift
  failed=0
  do_test "$($function_to_test /a/b/c/d /a/b/e/f; echo x)" = /a/bx
  do_test "$($function_to_test /long/names/foo /long/names/bar; echo x)" = /long/namesx
  do_test "$($function_to_test / /a/b/c; echo x)" = /x
  do_test "$($function_to_test a/b/c/d a/b/e/f ; echo x)" = a/bx
  do_test "$($function_to_test ./a/b/c/d ./a/b/e/f; echo x)" = ./a/bx
  do_test "$($function_to_test '
/
/
' '
/
'; echo x)" = '
/
'x
  do_test "$($function_to_test --/-- --; echo x)" = '--x'
  do_test "$($function_to_test '' ''; echo x)" = x
  do_test "$($function_to_test /foo/bar ''; echo x)" = x
  do_test "$($function_to_test /foo /fo; echo x)" = x
  do_test "$($function_to_test '--$`\! *@ \a\b\e\E\f\r\t\v\\\"'\'' 
' '--$`\! *@ \a\b\e\E\f\r\t\v\\\"'\'' 
'; echo x)" = '--$`\! *@ \a\b\e\E\f\r\t\v\\\"'\'' 
'x
  do_test "$($function_to_test /foo/bar //foo//bar//baz; echo x)" = /foo/barx
  do_test "$($function_to_test foo foo; echo x)" = foox
  do_test "$($function_to_test /fo /foo; echo x)" = x
  if [ $failed -ne 0 ]; then echo $failed failures; return 1; fi
}
3
20.08.2011, 00:44
1 ответ

Как последняя кавычка говорит, у Вас есть "dhcp", когда у Вас должно быть "руководство" для wlan0.

Попытайтесь измениться

iface wlan0 inet dhcp

кому:

руководство iface wlan0 inet

в /etc/network/interfaces.

Другой выбор состоит в том, чтобы использовать менеджера для сетевых соединений, например, Администратора сети Gnome или WICD.

2
27.01.2020, 21:29

Теги

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