В ударе Вы могли сделать что-то вроде этого.
Можно использовать (( ))
осуществлять арифметический контекст.
Когда дело доходит до размеров Вы имеете МБ по сравнению с мебибайт, видите диаграмму на правой стороне.
#!/bin/bash
psize()
{
local name="$1"
local -i val="$2";
local u=""
case "$3" in
"B") u="B" ;;
"K") u="KiB"; ((val /= 1024 ));;
"G") u="GiB"; ((val /= 1024 * 1024 * 1024 ));;
# Defaults to MiB
*) u="MiB"; ((val /= 1024 * 1024 ));;
esac
printf "%-22s: %d %s\n" "$name" "$val" "$u"
}
unit=""
# Check if wanted size is given by user
if [[ "$1" =~ ^(B|K|M|G)$ ]]; then
unit="$1"
fi
# Use tab as delimiter and read into variables "name" and "value"
while IFS=$'\t' read -r name value; do
case "$name" in
"innodb_log_file_size"|"innodb_log_buffer_size")
psize "$name" "$value" "$unit"
;;
esac
done < <(mysql -uroot -ppass -e "SHOW VARIABLES")
С grep
Если Вы хотите смешаться в grep и т.д.:
psize()
{
local -i a=$(mysql -uroot -ppass -e "SHOW VARIABLES" | \
grep innodb_log_file_size | cut -f2)
local -i b=0;
local u=""
case "$1" in
"B") u="B" ; b="$a";;
"K") u="KiB"; ((b = a / 1024 ));;
"G") u="GiB"; ((b = a / 1024 / 1024 / 1024 ));;
*) u="MiB"; ((b = a / 1024 / 1024 ));;
esac
printf "Innodb_log_file_size: %d %s\n" "$b" "$u"
}
unit="M"
if [[ "$1" =~ ^(B|K|M|G)$ ]]; then
unit="$1"
fi
psize "$unit"
Которым Вы могли использовать:
./myscript # Defaults to MiB
./myscript B # Print in bytes
./myscript G # Print in GiB
...
Поскольку касательно.
Используя awk:
psize()
{
awk -v unit="$1" '
BEGIN {
if (unit == "")
unit="M"
switch (unit) {
case "B":
ratio = 1;
break;
case "K":
ratio = 1024;
break;
case "G":
ratio = 1024 * 1024 * 1024;
break;
default:
ratio = 1024 * 1024;
break;
}
if (unit != "B")
unit = unit "iB"
}
/^innodb_log_file_size\s/ {
printf("Log size : %d %s\n", $2 / ratio, unit);
}
/^innodb_log_buffer_size\s/ {
printf("Buffer size: %d %s\n", $2 / ratio, unit);
}
' <(mysql -uroot -e "SHOW VARIABLES" -ppass)
}
psize "$unit"
Наконец-то (в конце концов) я выяснил, что является причиной проблемы с автоматическим переключением usb_mode.
Файл 40-usb_modeswitch.rules
в разделе /lib/udev/rules.d
содержит:
# Huawei, newer modems ATTR{idVendor}=="12d1", ATTR{idProduct}=="1446", RUN+="usb_modeswitch '%b/%k'"
Таким образом, мой модем должен быть автоматически usb_modeswitch
по 40-usb_modeswitch.rules
.
Но проблема в том, что /usr/sbin/usb_modeswitch
и /usr/sbin/usb_modeswitch_dispatcher
не установили chmod +x
(Разрешить выполнить файл). Вероятно, скрипт установки (прикрепленный в вопросе) имел изменённый атрибут.
В то время как вручную sudo usb_modeswitch -I -W -c /etc/usb_modeswitch.d/12d1\:1446
(объясняется в вопросе) I sudo chmod +x /usr/sbin/usb_modeswitch
, но /usr/sbin/usb_modeswitch_dispatcher
до сих пор не имеют разрешения на выполнение.
Итак, теперь у меня только sudo chmod +x /usr/sbin/usb_modeswitch_dispatcher
и я почти закончил!
После этого я удалил весь процесс ручного переключения, указанный в State4 (см. вопрос), и теперь мой модем успешно распознан как:
Bus 001 Device 004: ID 12d1:1436 Huawei Technologies Co., Ltd. E173 3G модем (модем-режим)
Другими словами 40-usb_modeswitch.rules
работает нормально.
Наконец я вернулся к State-1. [РЕШЕНА]
Пожалуйста, будьте уверены, что в файле конфигурации /etc/usb_modeswitch.conf
У вас есть
DisableSwitching=0
, в противном случае автоматический переключение режима отключено глобально.
попробуйте правило UDEV, запускайте скрипт каждый раз, когда вы Подключите модем.
ACTION=="add", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="UUUU", RUN+="/home/user/script.sh"
Замените XXXX и UUUU с продуктом поставщика и идентификатора, поставьте правило в /etc/udev/rules.d/99-yourrule.rules и перезагрузите или перезагрузите UDEV. Должен работать
Я столкнулся с той же проблемой, и принятое решение не помогло мне. Если у вас есть дистрибутив Raspbian, здесь обсуждается известная ошибка: https://github.com/RPi-Distro/repo/issues/47 .
Решение:
/lib/udev/rules.d/40-usb_modeswitch.rules
ATTRS {idVendor} == "12d1", ATTR {bInterfaceNumber} = = "00", ATTR {bInterfaceClass} == "08", RUN + = "usb_modeswitch '% b /% k'"
, изменив '% b /% k'
на "% k"
. Протестировано на Raspbian 8 с Huawei EC315.