Bash 스크립트 수정

Bash 스크립트 수정

현재 저는 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가 아닌 0SSD에 대해 묻고 있습니다 1.

두 번째 변수는 var1컴퓨터에 가상화가 있는지 확인합니다. 보유하고 있는 숫자가 이면 으로 설정되고 0, 다른 숫자이면 으로 설정됩니다 . 이 명령은 다른 코드 파일에서 실행하면 완벽하게 실행됩니다. 하지만 난 그 둘이 함께 필요해. 어떤 제안이 있으십니까?vtypenovtypeyes

답변1

이 스크립트에는 네 가지 주요 문제가 있습니다.

  1. #!맨 위 행이 누락되었습니다. 내가 아는 한 이것은 가능하다 #!/bin/sh.

  2. 변수 확장은 인용되지 않았습니다. 단어 분리 및 파일 이름 글로빙을 방지하려면 큰따옴표를 사용하십시오. 예를 들어, if [ "$var" = 0 ]. 수학 시험을 치르고 있으므로 여기에서 -eq대신 사용하도록 선택할 수도 있습니다 .=

  3. 과제 주변에는 공백이 없어야 합니다 =.

  4. 첫 번째 인수는 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 '.

관련 정보