使腳本在腳本本身內可執行

使腳本在腳本本身內可執行

我想要一個腳本來顯示保留區塊的百分比。如果可以用其他方式實現,那就太好了。

如果我手動使其可執行,這將有效。我可以使其在腳本本身內可執行嗎?

cat > somescript.sh << \EOF
#!/bin/bash

block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Block count:/ {print $NF}')
reserved_block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Reserved block count:/ {print $NF}')

perl -e 'printf("%.1lf%%\n", ($ARGV[0] * 100.0 ) / $ARGV[1])' "$reserved_block_count" "$block_count"
EOF

答案1

回答你的問題

當然這是可能的——但我不認為這是好的風格。請參閱下文以獲得更好的解決方案。

如果您執行 shell 並將腳本檔案作為參數提供給它,無論是否存在 shebang 或任何執行位,它都會執行它:

$ cat no_script
chmod +x /path/to/no_script
$ ls -l no_script
-rw-rw-r-- 1 dessert dessert 24 Jun 12 22:59 script
$ bash no_script
$ ls -l no_script
-rwxrwxr-x 1 dessert dessert 24 Jun 12 22:59 script

如果腳本被執行多次,您可能不想chmod每次都不需要調用,因此只需測試檔案是否不可執行:

[ ! -x /path/to/script ] && chmod +x /path/to/script

至於您的腳本,awk可以在一次呼叫中完成整個操作:

#!/bin/bash
tune2fs -l /dev/sda1 | awk '/^Block count:/{a=$NF}/^Reserved block count:/{b=$NF}END{printf "%.1f%%\n", b/a*100}'

我刪除了sudo因為你不要在腳本中使用它– 以 root 身分執行整個腳本。

解決您的問題

我從你的問題中讀到,你對設定腳本所需的兩個步驟感到困擾。讓我們編寫一個腳本來幫助解決這個問題:

#!/bin/bash
cat <&0 >"$1" &&
chmod +x "$1"

cat <&0 >"$1"從標準輸入cat讀取並寫入您作為第一個參數提供的腳本檔案。將其另存為 例如makescript並使其可執行chmod +x /path/to/makescript。現在,如果您想編寫腳本,只需這樣做:

/path/to/makescript /path/to/new/script <<EOF … EOF

如果您不想/path/to/makescript每次都輸入,請定義一個別名,例如makescript=/path/to/makescript在您的~/.bash_aliases或中~/.bashrc,或者將其移動到您的PATH.

運行範例

$ echo -e '#!/bin/bash\ncat <&0 >"$1" &&\nchmod +x "$1"' >makescript
$ chmod +x makescript 
$ ./makescript a_test_script <<EOF
> #!/bin/bash
> echo a script
> EOF
$ ls -l *script
-rwxrwxr-x 1 dessert dessert 26 Jun 13 12:44 a_test_script
-rwxrwxr-x 1 dessert dessert 43 Jun 13 12:44 makescript
$ ./a_test_script 
a script

天空才是極限。

答案2

如果您想編寫腳本的內容並使其在同一命令(某種程度)中可執行,您可以簡單地在chmod後面添加cat

$ cat > somescript.sh << \EOF && chmod a+x somescript.sh && sudo ./somescript.sh
#!/bin/bash
# Show percentage of reserved blocks
#
tune2fs -l /dev/sda5 |
     awk '/^Block count:/{bc=$NF}
          /^Reserved block count:/{rbc=$NF}
          END{printf "%.1f%%\n", (rbc*100)/bc}'
EOF

我還冒昧地簡化了你的腳本。您已經在使用了awk,所以您不妨在那裡完成所有的事情。

答案3

cat > somescript.sh << \EOF
#!/bin/bash
# Show percentage of reserved blocks

block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Block count:/ {print $NF}')
reserved_block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Reserved block count:/ {print $NF}')

perl -e 'printf("%.1lf%%\n", ($ARGV[0] * 100.0 ) / $ARGV[1])' "$reserved_block_count" "$block_count"
EOF

chmod +x somescript.sh

somescript.sh

相關內容