在Linux中执行shell(bash)脚本的方法

在Linux中执行shell(bash)脚本的方法可分为

  • 路径直接执行
  • shbash 命令执行
  • 用点 .source 命令执行

路径直接执行和用用 shbash 会新开子shell来执行脚本
用点 .source 命令直接在当前shell执行脚本

演示用脚本

假设在 /MyBashs/ 有脚本 BashScript001.sh , 全路径名: /MyBashs/BashScript010.sh

sudo mkdir -p /MyBashs/
cd /MyBashs/
sudo vi  /MyBashs/BashScript010.sh
sudo mkdir -p /MyBashs/ ; cd /MyBashs/ ; sudo vi  /MyBashs/BashScript010.sh

脚本头

#!/bin/bash

经测试, 有没有脚本头 ,都可以执行


echo '$!'=$!
echo '$?'=$?
echo '$-='$-
echo '$$='$$
echo '$@='$@
echo '$*'=$*
echo '$%='$%
echo '$0='$0
echo '$#='$#
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$4='$4
echo '$5='$5
printf '$6='"$6\n"
printf '$7='"$7\n"
echo '$8='"$8"
echo '$9='"$9"
echo '$10'=$10
echo '$11'=$11
echo '$12='$123456789
echo '$13='${13}
echo '$14='$14
echo '$15='"${15}"
echo '$16='$16
echo '$17='${17}
echo '$18'=${18}
echo '$19'=${19}
echo '$20'=${20}
echo '$21'=${21}
echo '$22='=${22}




路径执行

按路径直接执行,需要脚本文件有可执行权限, 一般自己创建的文件有读写权限,但没有可执行权限
可以用sudo chmod 777 文件路径全名 开启文件全部权限

开启文件可执行权限的方法
  1. sudo chmod 777 文件路径全名
    777 等效 a=rwx 等效 ugo=rwx 等效 augo=rwx 等效 a+rwx 等效 ugo+rwx 等效 augo+rwx 等效 ugao+xrw
  2. sudo chmod 775 文件路径全名
  3. sudo chmod u+x 文件路径全名
  4. sudo chmod g+x 文件路径全名
  5. sudo chmod o+x 文件路径全名
  6. sudo chmod a+x 文件路径全名
  7. sudo chmod +x 文件路径全名
  8. sudo chmod ugo+x 文件路径全名
  9. sudo chmod ugoa+x 文件路径全名
  10. sudo chmod a+x 等效 sudo chmod ugo+x 等效 sudo chmod augo+x 等效 sudo chmod +x
  11. sudo chmod u=rwx,g=rwx,o=x 文件路径全名
  12. sudo chmod ug=xrw,o=x 文件路径全名
绝对路径执行
/MyBashs/BashScript010.sh
相对路径执行

相对路径执行就是进到脚本所在文件夹, 然后 ./脚本

cd /MyBashs
./BashScript010.sh
配置路径环境变量PATH执行

配置PATH后, 就能在任意文件夹, 像执行命令一样, 直接输入脚本名就能执行 , 会在子Shell中执行
配置环境变量中的PATH变量的方法

  • PATH 包含多个路径 , 分隔符是:冒号
  • 系统会在PATH包含的路径中搜索命令 , 能搜索到才会执行.
  • .点表示当前目录
  • PATH在每个Shell进程中是独立的,互不影响
  • export 后, 每新开一个Shell(bash), 都会复制一个父Shell的PATH到子Shell中, 因为 “路径执行” 和 “sh或bash执行” 都会新开一个子Shell去运行脚本, 如果不加export, 则对PATH的修改,在子Shell中不会起作用.
    export只是复制变量到子Shell, 在子Shell中对同名变量的修改不会影响到父Shell的同名变量
配置临时配置环境变量
export PATH=$PATH:.
export PATH=$PATH:/MyBashs
或
export PATH=$PATH:.:/MyBashs
加上双引号更保险
export PATH="$PATH:."
export PATH="$PATH:/MyBashs"
export PATH="$PATH:.:/MyBashs"

这样修改的变量,在退出登录时就会失效

配置本用户的长期环境变量,

将上面对变量的修改写入 /etc/bashrc 或者 ~/.bashrc

str=":\/MyBashs" ;\
fileName='/etc/bashrc';
[ -f $fileName.bak ] || cp -a $fileName ${fileName}.bak;
[[ `cat $fileName` == *$str* ]] && ( echo "$fileName文件中,已存在 $str 所以无需设置" ) || (echo "在 $fileName 中加入了 $str")  ; echo $PATH ;
unset str; unset fileName;

[[ `cat /etc/bashrc` = */MyBashs* ]] || echo "export PATH=$PATH:/MyBashs" >> ~/.bashrc




shbash 命令执行

shbash 命令会新开shell执行
在脚本文件夹时可用

sudo bash BashScript010.sh
或
sudo sh BashScript010.sh
或
sudo bash ./BashScript010.sh
或
sudo sh ./BashScript010.sh

不在脚本文件夹时可用全路径

sudo bash /MyBashs/BashScript010.sh
或
sudo sh /MyBashs/BashScript010.sh




用点 .source 命令执行

.source 会直接在本shell执行, 不会新开子shell

source是Shell(准确地说是Bash)的内置命令,在Bourne Shell中的等价命令是一个点.,即点命令。
用source命令执行脚本文件时,是在当前Shell进程中执行,而不是像./与sh方式一样在新的Shell进程中执行,因此早先设置的变量在脚本里是可以读取到的

  • source (从 C Shell 而来)是bash shell的内置命令
  • . 点命令来自 Bourne Shell , 是source的另一种写法(等价)

在脚本文件夹时可用

sudo source BashScript010.sh
或
sudo . BashScript010.sh
或
sudo source ./BashScript010.sh
或
sudo . ./BashScript010.sh

不在脚本文件夹时可用全路径

sudo source /MyBashs/BashScript010.sh
或
sudo . /MyBashs/BashScript010.sh
Logo

更多推荐