다음 스크립트를 작성하려고 합니다.
echo "#!/bin/sh" >/script
echo "del x.txt" >>/script
/script 파일이 비어 있으면 마녀가 수행하고, 그렇지 않으면 마지막 텍스트에 첫 번째 줄을 추가합니다.
#!/bin/sh
del x.txt#!/bin/sh
del x.txt
에코 빈 줄을 먼저 추가하면 파일이 비어 있지 않으면 다시 괜찮지만 비어 있으면 스크립트가 실행되지 않습니다.
echo "" >>/script
echo "#!/bin/sh" >>/script
echo "del x.txt" >>/script
편집하다:
내가 하고 싶은 일을 정확히 설명하겠습니다. 내 asuswrt 라우터에서 포트 전달 스크립트에 새 규칙을 추가하고 싶고 방화벽이 활성화되어 있습니다.
echo "#!/bin/sh" >/jffs/scripts/firewall-start
echo "" >>/jffs/scripts/firewall-start
echo "iptables -I INPUT -p tcp --destination-port 3000 -j ACCEPT" >>/jffs/scripts/firewall-start
이렇게 하면 /jffs/scripts/firewall-start의 모든 텍스트를 덮어쓰게 됩니다.
스크립트를 처음부터 새로 만들거나 이 줄을 추가하되 마지막 줄에 텍스트를 추가하는 대신 새 줄에서 시작하는 솔루션을 원합니다. 빈 줄로 시작하고 스크립트가 비어 있으면 #!/bin/sh가 첫 번째 줄에 있어야 하므로 실행되지 않습니다.
echo "" >>/jffs/scripts/firewall-start
echo "#!/bin/sh" >/jffs/scripts/firewall-start
echo "" >>/jffs/scripts/firewall-start
echo "iptables -I INPUT -p tcp --destination-port 3000 -j ACCEPT"
/jffs/scripts/방화벽-시작
답변1
유닉스를 사용하여 파일이 비어 있는지 테스트할 수 있습니다 test -s
. 아래 예...
if [ -s $file ]
then
echo "File size is zero"
else
echo "File size is not zero"
fi
답변2
사례를 재생성해 보았고 파일의 마지막 줄이 다음으로 끝나지 않으면 사례가 생성될 수 있음 을 발견했습니다 newline
(예: echo -n '#!/bin/bash' > /script
다음을 사용하는 경우 이런 일이 발생할 수 있음).echo "del x.txt" >>/script
cat /script
#!/bin/bashdel x.txt
이를 방지하려면 다음을 sed
사용할 수 있습니다.echo
sed -i '$a\del x.txt' /script
-i
--in-place
입력 파일 수정
$
마지막 줄을 뜻함
a
추가 명령
답변3
다음과 같이 파일에서 첫 번째 줄을 얻을 수 있습니다.
read -r varname <file
파일에 하나 미만의 \n
ewline이 포함되어 있거나 파일이 존재하지 않거나 읽을 수 없는 경우 위 명령은 0이 아닌 값을 반환합니다. 그렇지 않으면 0을 반환하고 $varname
파일의 첫 번째 줄을 포함합니다.
실제로 어떤 이유로든 파일을 읽을 수 없는 경우 구문이 명령이 아닌 연산자이기 <doesntexist
때문에 리디렉션으로 인해 스크립트된 셸이 종료될 가능성이 높습니다 . <
그러나 command <doesntexist
이 동작은 무효화되고 운영자의 상태는 <
신뢰할 수 있는 테스트 가능한 조건으로 다운그레이드됩니다.
따라서 다음과 같이 할 수 있습니다.
line1=
command read -r line1 <file &&
echo delx.txt >> file ||
printf %s\\n '#!/bin/sh' "# $line1" delx.txt >file
ewline이 포함된 파일에 추가 \n
하거나 잘린 파일의 머리 부분에 해시뱅을 삽입하여 주석의 이전 내용을 포함합니다.(NUL 바이트가 없고 존재하는 경우)~의문서, \n
ewline, 마지막으로 stringdelx.txt다음은 또 다른 eline입니다 \n
.
이런 내용이 포함되어 있거나 스크립트가 실제로하다echo
printf
쓰려는 파일이 쓰기 가능하지 않기 때문에 또는 행에서 실패합니다 . 이는 아마도 좋은 일입니다.