아직 파일의 일부가 아닌 경우에만 파일에 줄을 삽입합니다.

아직 파일의 일부가 아닌 경우에만 파일에 줄을 삽입합니다.

텍스트 기반 구성 파일에 일부 사용자 정의 구성을 자동으로 적용하는 스크립트를 작성하려고 합니다.

/etc/sysctl.conf현재의 경우 파일에 아직 없는 경우 2줄을 추가하려고 합니다 (이 줄이 파일에 여러 번 표시되는 것을 방지하기 위해).

이것은 내가 사용하는 스크립트입니다.

if [ `grep vm.swappiness /etc/sysctl.conf` != "vm.swappiness=5" ]; then
echo vm.vfs_cache_pressure=50 | sudo tee -a /etc/sysctl.conf
fi
if [ `grep vm.vfs_cache_pressure /etc/sysctl.conf` != "vm.vfs_cache_pressure=50" ]; then
echo vm.vfs_cache_pressure=50 | sudo tee -a /etc/sysctl.conf
fi

내가 얻는 오류는 다음과 같습니다.

/home/erwan/Workspace/Install.sh: ligne 19 : [: != : opérateur unaire attendu
/home/erwan/Workspace/Install.sh: ligne 23 : [: != : opérateur unaire attendu

내가 뭘 잘못했나요?

답변1

이것은 문제입니다:

if [ `grep vm.swappiness /etc/sysctl.conf` != "vm.swappiness=5" ]; then

왜냐하면 grep아무것도 찾지 못하면 아무 것도 출력하지 않고 왼쪽에도 아무 것도 없을 것이기 때문입니다. 이는 오류입니다. 출력에 공백이 포함될 수 있으므로(예: vm.swappiness파일에서 여러 번 나타나는 경우) 무언가를 찾은 경우에도 문제가 됩니다 . 따옴표로 묶어야 합니다. 그렇지 않으면 확장 시 일련의 다른 문자열로 표시됩니다.

if [ "$(grep ...)" ]따라서 출력을 인용하려면 따옴표를 사용해야 합니다 . 출력이 없으면 ""bash 테스트의 양쪽 모두에 문제가 없는 가 있습니다.

그러나 이 경우에는 다음을 사용하는 것이 좋습니다.종료 상태대신 grep. 에서 man grep:

종료 상태

일반적으로 종료 상태는 선택한 행이 발견되면 0이고, 그렇지 않으면 1입니다. 하지만 오류가 발생하면 종료 상태는 2입니다.

스위치 도 유용합니다 -q.

-q, --조용함, --무음

조용합니다. 표준 출력에 아무 것도 쓰지 마십시오. 지금 종료제로 상태일치하는 항목이 있으면 오류가 감지됩니다.

따라서 $?마지막으로 완료된 포그라운드 프로세스의 종료 상태를 기억하세요.

grep -q grep vm.vfs_cache_pressure /etc/sysctl.conf
if [ $? -eq 1 ]; then

grep아무 것도 발견되지 않고 오류가 발생하지 않으면 이 조건은 true입니다.

답변2

아마도 grep아무것도 반환하지 않기 때문일 것입니다. 참조되지 않았으므로 해당 오류 메시지가 표시됩니다(단항 연산자 필요). 노력하다:-

if [ "$(grep vm.swappiness /etc/sysctl.conf)" != "vm.swappiness=5" ]; then

답변3

영감을 얻기 위해 약간의 조정이 필요할 수 있습니다.

#assuming there is only one line with vm.swappiness
#otherwise you can use the test command with "grep -c vm.swappiness" first
#tests if the correct line is in the file
if grep -q -E '^vm.swappiness=5$' /etc/sysctl.conf; then
    echo "all good, do nothing";
else
    echo "removing possible lines with vm.swappiness"
    sudo sed -i '/^vm.swappiness=/d' /etc/sysctl.conf 
    echo "adding line with correct swappiness"
    sudo bash -c "echo 'vm.swappiness=5' >> /etc/sysctl.conf"
fi

또한 다음 인수로도 호출할 수 있도록 함수로 래핑하는 것이 좋을 수도 있습니다.

답변4

이것은 효과가 있을 수 있습니다:

f=/etc/sysctl.conf
[ -w "$f" ] || exit 1
for line in 'vm.swappiness=5' 'vm.vfs_cache_pressure=50' ; do
    grep -q "$line" <"$f" || printf %s\\n "$line"
done >>"$f"

sudo아마도 해당 스크립트도 제거해야 할 것입니다 . 필요한 경우 스크립트를 실행합니다.그리고 sudo좋아요를 sudo ./script.sh누르고 다른 스크립트와 별도의 모듈로 사용하세요. 그렇지 않으면 다음을 수행하십시오.

sudo sh -c '
    f=/etc/sysctl.conf
    [ -w "$f" ] || exit 1
    for line in "vm.swappiness=5" "vm.vfs_cache_pressure=50" ; do
        grep -q "$line" <"$f" || printf %s\\n "$line"
    done >>"$f"
'

그러나 나는 그것을 권장하지 않습니다.

관련 정보