이 줄이 아직 파일의 일부가 아닌 경우에만 파일에 줄 삽입

이 줄이 아직 파일의 일부가 아닌 경우에만 파일에 줄 삽입

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

/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

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

if [ "$(grep ...)" ]따라서 출력이 인용되도록 사용해야 합니다 . 출력이 없으면 ""bash 테스트의 어느 쪽이든 괜찮습니다.

하지만 이 경우에는 다음을 사용하는 것이 좋습니다.종료 상태대신 grep을 사용하세요. 에서 man grep:

종료 상태

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

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

-q, --quiet, --silent

조용한; 표준 출력에 아무 것도 쓰지 마십시오. 즉시 종료상태가 0인일치하는 항목이 발견되면 오류가 감지된 경우에도 마찬가지입니다.

따라서 $?마지막으로 완료된 포그라운드 프로세스의 종료 상태를 염두에 두십시오.

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"
'

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

관련 정보