텍스트 기반 구성 파일에 일부 사용자 정의 구성을 자동으로 적용하는 스크립트를 작성하려고 합니다.
/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"
'
그러나 나는 그것을 권장하지 않습니다.