次のスクリプトを作成しようとしています。
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' > /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
ファイルに1つ未満の\n
ewlineが含まれているか、ファイルが存在しないか読み取れない場合、上記のコマンドはゼロ以外の値を返します。それ以外の場合は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、最後に文字列delx.txt以下は別のエリーンです\n
。
これが含まれているか、スクリプトが実際にするecho
printf
書き込むファイルが書き込み可能ではないため、または行で失敗します。これはおそらく良いことです。