Сравнение переменных в bash - PullRequest
2 голосов
/ 18 апреля 2019

Я пытаюсь выяснить, является ли диск SSD или HDD, используя скрипт bash.

logical_name="/dev/sda"
type="" 
disk=$(basename $logical_name)
x=`cat $filename | grep "${disk}" | awk '{print $2}'`
if [ ! -z "$x" ]
then
        if [ "$x" = "0" ]
        then
                type="SSD"
        fi  
        if [ "$x" = "1" ]
        then
                type="HDD"
        fi  
fi

echo $type

Значение x верное, 0 или 1. Но после сравнения не присваивается значение переменной type. Он печатается как пустой. Кто-нибудь может указать, что я здесь делаю не так?

Дополнительная информация:

$ filename - это файл, который содержит вывод sudo lsblk -d -o name,rota

NAME ROTA
sda     1
sdd     1
sdc     0

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Команда lsblk позволяет указать устройство, поэтому вам не нужно grep через вывод lsblk найти устройство, которое вас интересует. Это также означает, что вам не нужен name столбец. Кроме того, вы можете отключить заголовок с помощью -n, а опция -r (необработанный вывод) удаляет начальные и конечные пробелы:

> hdtype() { lsblk -drno rota "$1" | sed 's/1/HDD/;s/0/SSD/'; }

> hdtype /dev/sda
HDD

Что касается того, почему ваш код не работает, я не уверен. В моем bash-терминале все работало нормально.

1 голос
/ 18 апреля 2019

Хотя я не вижу никаких проблем с размещенным кодом, ниже будет более упрощенная и поддерживаемая версия для того же.

DISK_NAMES=(SSD HDD)  # names are resolved by index

filename="in1.txt"
logical_name="/dev/sda"
disk="$(basename $logical_name)"
x="$(sed -n 's/'$disk' *\([0-9]*\)/\1/p' $filename)"
# check if $x is empty here, if required
echo "$x -> ${DISK_NAMES[$x]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...