使脚本本身可执行脚本

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

如果我手动使其可执行,这是有效的。 我可以在脚本本身内使其可执行吗?

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 

回答你的问题

当然这是可能的 – 但我不认为它的风格很好。 请参阅下面的更好解决方案。

如果您运行一个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从stdin读取并写入脚本文件,作为第一个参数。 将其保存为例如makescript并使用chmod +x /path/to/makescript使其可执行。 现在,如果你想编写一个脚本,只需这样做:

 /path/to/makescript /path/to/new/script < 

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

示例运行

 $ echo -e '#!/bin/bash\ncat <&0 >"$1" &&\nchmod +x "$1"' >makescript $ chmod +x makescript $ ./makescript a_test_script < #!/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 

天空才是极限。

如果您想编写脚本的内容并使其在同一命令(sorta)中可执行,您可以在cat之后添加chmod

 $ 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 ,所以你也可以在那里完成整个事情。

 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