エコーを使用してテキストを追加してもファイルが空でない場合は、新しい行から始めます。

エコーを使用してテキストを追加してもファイルが空でない場合は、新しい行から始めます。

次のスクリプトを作成しようとしています。

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

Unixを使用してファイルが空であるかどうかをテストできます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' > /scriptecho "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

ファイルに1つ未満の\newlineが含まれているか、ファイルが存在しないか読み取れない場合、上記のコマンドはゼロ以外の値を返します。それ以外の場合は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、最後に文字列delx.txt以下は別のエリーンです\n

これが含まれているか、スクリプトが実際にするechoprintf書き込むファイルが書き込み可能ではないため、または行で失敗します。これはおそらく良いことです。

関連情報