그래서 저는 기계에 배터리가 있는지 확인한 다음, 배터리 유무에 따라 다른 명령을 실행하려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다:
upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
echo "BAT0 PRESENT" >> /tmp/batstat
else
echo "NO BAT0" >> /tmp/batstat
fi
그러나 예상대로 BAT0이 /tmp/batstat에 기록되지 않으면 "bash: [:Too Many Arguments" 오류가 반환됩니다. grep을 실행하는 것만으로도 잘 작동하는데 왜 if 조건으로 작동하지 않는지 이해할 수 없습니다.
배터리를 확인하는 더 좋은 방법이 있다면 100% 열려 있습니다.
답변1
if upower -d | grep -qF BAT0 ; then
echo "BAT0 PRESENT"
else
echo "NO BAT0"
fi
if
일련의 명령을 실행하고 마지막 명령(이 경우 grep)의 상태를 처리합니다. grep
일치하는 항목이 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
답변2
grep -F BAT0 /tmp/batstat
확실히 test
내장된 조건식이 아닙니다(아름다운 매뉴얼에 자세히 설명되어 있습니다) bash
. 의 출력이 grep
사용되지 않으므로 -q
옵션 및 종속 종료 코드로 충분할 수 있습니다.
grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
echo yea
else
echo nay
fi
게다가 /tmp/batstat
이는 매우 잘못된 선택이 될 수 있으며, 특히 악의적인 로컬 사용자가 액세스할 수 있는 경우 더욱 그렇습니다. 대신 사용해 보세요.mktemp(1)
, 또는 아래에서 파일을 찾을 수 없습니다 /tmp
.