失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > shell执行脚本的方法及环境变量

shell执行脚本的方法及环境变量

时间:2023-02-01 13:41:18

相关推荐

shell执行脚本的方法及环境变量

执行脚本的方法

(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)

(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)

(3)source ./filename.sh(使用当前进程执行,source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)

(4). filename.sh(和source一样,也是使用当前进程执行)

[root@qingyuxin SHELL]# vim test.sh #!/bin/bashsleep 200

分别用两类不同的方式启动脚本

另起一个终端查看启动后的进程信息

例如:

[root@localhost test]# vim test2.sh#!/bin/bashcd /tmppwd[root@localhost test]# ls -l test2.sh-rw-r--r--. 1 root root 24 Apr 30 20:09 test2.sh(1)[root@localhost test]# bash test2.sh/tmp(2)[root@localhost test]# ./test2.sh-bash: ./test2.sh: Permission denied[root@localhost test]# chmod a+rx test2.sh[root@localhost test]# ./test2.sh/tmp(3)[root@localhost test]# source test2.sh/tmp[root@localhost tmp]#(4)[root@localhost test]# . test2.sh/tmp[root@localhost tmp]#

执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,所以子进程

切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执

行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成/tmp。

环境变量(全局变量)和普通变量(局部变量)

1、环境变量

环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用(su -

切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和bash内置的环境变量。

(1)自定义环境变量

一般是指用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。环

境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前

shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。

①用户的环境变量配置(non-login shell)

/.bash_profile或/.bashrc

②全局环境变量的配置(login shell)

/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。

注意:按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用

命令export导出。

有一些环境变量,比如HOME,PATH,SHELL,UID,USER等,在用户登录前就已经被/bin/login程序设置

好了,通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile

中。

(2)bash内置的环境变量

shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时,都会接收一组变量

来确定登录用户名、命令路径、终端类型、登录目录等,这组变量就是环境变量。环境变量会影响到所

有的脚本的执行结果

2、普通变量

普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访

问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数

也是局部变量。

用户登录时访问的环境变量过程图:

练习:

1、定义两个变量:num1=10和num2=2

num1=10num2=2

使用(()): 计算num1 + num2的值并输出

echo "num1+num2=$((num1+num2))"

使用let: 计算num1 * num2的值输出

let num3=$num1*$num2echo "num1*num2=$num3"

使用expr: 计算num1 对 num2执行或的位运算

echo "num1 | num2=` expr $num1 \| $num2`"

说明:与符号”|“前面的“\”代表转义字符。

使用$[]: 计算 num2的num1次方值

echo "num2**num1=$[num2**num1]"

declare: 计算 num1 除以 num2的值

declare -i num5=$num1/$num2echo "num1/num2=$num5"

计算num2除num1的值(使用bc)

echo "num2/num1= $[$num2/$num1|bc]"

整体效果:

代码:

vim test1.sh

#!/bin/bash##########################File name:test1.sh#Version:v1.0#Email:admin@#Created time:-01-30 19:14:20#Description:#########################num1=10num2=2echo "num1+num2=$((num1+num2))"let num3=$num1*$num2echo "num1*num2=$num3"echo "num1 | num2=` expr $num1 \| $num2`"echo "num2**num1=$[num2**num1]"declare -i num5=$num1/$num2echo "num1/num2=$num5"echo "num2/num1= $[$num2/$num1|bc]"

2、 path=/data/data1/data2.txt

去获取它所在的目录

$ {parameter##word}: 从变量${parameter}开头开始删除最长匹配的word子串。

echo ${path%/*}

去获取文件的名字

KaTeX parse error: Expected '}', got '#' at position 11: {parameter#̲#word} :从变量{parameter}开头开始删除最长匹配的word子串

echo ${path##*/}

3、 设置一个只针对root的环境变量:ENV_ROOT=ROOT

设置一个针对所有用户的环境变量: ENV_ALL=ALL

在root用户下访问:ENV_ROOT和ENV_ALL

在普通用户下访问:ENV_ROOT和ENV_ALL

①用户的环境变量配置(non-login shell)

/.bash_profile或/.bashrc

在root用户下访问ENV_ROOT为空

原因:当用户登录时会自动读取bash文件的所有环境变量,但是我们刚刚写入的环境变量是root用户登录后写入的,因此root用户还没有没有读取到ENV_ROOT

**解决办法:**以不产生子进程的方式执行刚刚写的bash脚本,让root用户读取脚本中的环境变量

②全局环境变量的配置(login shell)

/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。

切换到普通用户:

普通用户不能访问针对root的环境变量。

如果觉得《shell执行脚本的方法及环境变量》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。