현재 저는 bash 스크립트에서 작동하도록 2개의 코드를 얻으려고 노력하고 있습니다. 모두 개별적으로 작동하지만 둘 다 코드에 포함되면 더 이상 작동하지 않습니다.
var=$(cat /sys/block/vda/queue/rotational 2>/dev/null || cat /sys/block/sda/queue/rotational 2>/dev/null)
dtype='nil'
if [ $var = 0 ]; then
dtype=' SSD '
elif [ $var = 1 ]; then
dtype=' HDD '
fi
var1=$(lsmod | grep kvm | awk 'NR==1{print $3}' 2>/dev/null)
vtype = 'no'
if [ $var1 = 0 ]; then
vtype=' no '
else
vtype = 'yes'
fi
printf '$dtype' '$vtype'
echo $dtype $vtype
첫 번째 변수는 var
회전된 파일의 값을 보유해야 합니다. HDD가 아닌 0
SSD에 대해 묻고 있습니다 1
.
두 번째 변수는 var1
컴퓨터에 가상화가 있는지 확인합니다. 보유하고 있는 숫자가 이면 으로 설정되고 0
, 다른 숫자이면 으로 설정됩니다 . 이 명령은 다른 코드 파일에서 실행하면 완벽하게 실행됩니다. 하지만 난 그 둘이 함께 필요해. 어떤 제안이 있으십니까?vtype
no
vtype
yes
답변1
이 스크립트에는 네 가지 주요 문제가 있습니다.
#!
맨 위 행이 누락되었습니다. 내가 아는 한 이것은 가능하다#!/bin/sh
.변수 확장은 인용되지 않았습니다. 단어 분리 및 파일 이름 글로빙을 방지하려면 큰따옴표를 사용하십시오. 예를 들어,
if [ "$var" = 0 ]
. 수학 시험을 치르고 있으므로 여기에서-eq
대신 사용하도록 선택할 수도 있습니다 .=
과제 주변에는 공백이 없어야 합니다
=
.첫 번째 인수는
printf
형식 문자열이어야 합니다(예: )printf '%s %s\n' "$dtype" "$vtype"
.
이러한 것들은 다음을 사용하여 찾을 수 있습니다.쉘체크 웹사이트.
약간의 비효율성도 있습니다.
lsmod | grep kvm | awk 'NR==1{print $3}' 2>/dev/null
거의 동일하게 다음과 같이 쓸 수 있습니다.
lsmod | awk '/kvm/ { print $3; exit }'
예를 들어 특정 변수의 값에 공백을 넣는 이유가 무엇인지 잘 모르겠습니다 dtype=' HDD '
.