에코를 사용하여 텍스트를 추가하지만 파일이 비어 있지 않으면 새 줄에서 시작합니다.

에코를 사용하여 텍스트를 추가하지만 파일이 비어 있지 않으면 새 줄에서 시작합니다.

다음 스크립트를 작성하려고 합니다.

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

파일에 하나 미만의 \newline이 포함되어 있거나 파일이 존재하지 않거나 읽을 수 없는 경우 위 명령은 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 바이트가 없고 존재하는 경우)~의문서, \newline, 마지막으로 stringdelx.txt다음은 또 다른 eline입니다 \n.

이런 내용이 포함되어 있거나 스크립트가 실제로하다echoprintf쓰려는 파일이 쓰기 가능하지 않기 때문에 또는 행에서 실패합니다 . 이는 아마도 좋은 일입니다.

관련 정보