使脚本可以从脚本本身执行

fix*_*it7 0 scripts

我想要一个脚本来显示保留块的百分比。如果它可以以另一种方式完成,那就太好了。

如果我手动使其可执行,这将起作用。我可以让它从脚本本身中执行吗?

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
Run Code Online (Sandbox Code Playgroud)

des*_*ert 5

回答你的问题

当然这是可能的——但我认为它不是很好的风格。请参阅下文以获得更好的解决方案。

如果您运行一个 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
Run Code Online (Sandbox Code Playgroud)

如果脚本多次执行,您可能不想chmod每次都不需要调用,所以只需测试文件是否不可执行:

$ 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
Run Code Online (Sandbox Code Playgroud)

至于你的脚本,awk可以在一次调用中完成整个事情:

[ ! -x /path/to/script ] && chmod +x /path/to/script
Run Code Online (Sandbox Code Playgroud)

我删除了sudo因为你不在脚本中使用它——而是以 root 身份运行整个脚本。

解决您的问题

我从您的问题中了解到,您对设置脚本所需的两个步骤感到困扰。让我们编写一个脚本来帮助解决这个问题:

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

cat <&0 >"$1"品牌cat从标准输入和写你给它的第一个参数的脚本文件读取。将其另存为 egmakescript并使用chmod +x /path/to/makescript. 现在,如果您想编写脚本,只需这样做:

#!/bin/bash
cat <&0 >"$1" &&
chmod +x "$1"
Run Code Online (Sandbox Code Playgroud)

如果您不想/path/to/makescript每次都键入,请makescript=/path/to/makescript在您的~/.bash_aliases或 中定义别名~/.bashrc或将其移动到PATH.

示例运行

/path/to/makescript /path/to/new/script <<EOF … EOF
Run Code Online (Sandbox Code Playgroud)

天空才是极限。