Shell脚本执行的三种方式

参考:https://blog.csdn.net/timchen525/article/details/76407735

  1. bash script-namesh script-name
  2. path/script-name./script-name
  3. source script-name. script-name

(1)bash script-namesh script-name
这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法(不管脚本有无可执行权限都可以通过这种方式运行),或者脚本文件开头没有指定解释器时需要使用的方法(这种脚本运行方式的bash或sh意思就是给脚本指定了命令解释程序,而脚本中第一行的#!/bin/bash或#!/bin/sh与此作用相同)。推荐使用这种方法

(2)path/script-name./script-name
执行条件有二:脚本文件被赋予了执行权限脚本文件第一行指定了命令解释程序(一般为#!/bin/bash)
注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错。因此,推荐第一种 bashscript-name

(3)source script-name. script-name
source或者 “.” 命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或 “.” 加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他集中执行shell方式的最大不同。

举个栗子:
新建一个文件test.sh,不给它赋予任何执行权限
在这里插入图片描述
test.sh 内容如下

name="Louzen"
echo "set name to Louzen"

这个脚本文件与常见的shell不同之处在于,这里的文件没有赋予可执行权限以及在文件内容中的首行中没有添加#!/bin/bash
我们现在用上述介绍的几种方式来测试下效果。

第一种:bash test.sh

可以执行脚本内容,但是脚本中设置的name变量却输出为空
在这里插入图片描述
name值是空的,是因为bash script-name 是产生了一个子进程shell,而我们当前的操作还在父进程shell中,因此得不到name变量。

第二种:./test.sh

不能执行脚本内容,赋予权限后可以执行,但是name变量还是输出为空
在这里插入图片描述
name为空,原因与第一种相同

第三种:source test.sh

test.sh 没有执行权限的情况下可以执行,并且成功输出name的值
在这里插入图片描述
可以成功的输出变量的值。这是因为source script-name和. script-name是将script-name中的内容直接加载到当前的shell,因此能够输出当前变量的值。

补充知识点
一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:
#!/bin/bash#!/bin/sh

注意
(1)在Shell中如果一行如果以 “#!” 开头,就是在指明命令解释程序(解释器),如果第一行仅以 “#” 开头,就是一个普通的注释,除第一行之外的其他行,只要第一个字符是 “#” 那就都是注释。
(2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。二者的区别是有没有开启posix模式,具体参考:https://blog.csdn.net/wangxin6722513/article/details/44922695

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell脚本是一种命令行解释器,可以直接执行命令、操作文件等。在实际应用中,运行的Shell脚本往往需要传入参数来控制脚本的行为和逻辑,因此学会Shell脚本传参对于我们写出好的脚本是十分必要的。下面介绍Shell脚本传参的三种方式: 1. 位置参数传参: 通过$1、$2、$3...的变量获取传入的参数,其中$0表示脚本的名字。 例如: ``` #!/bin/bash echo "The first parameter is $1 and the second parameter is $2." ``` 执行: ``` ./test.sh hello world ``` 输出: ``` The first parameter is hello and the second parameter is world. ``` 2. 特殊变量传参: Shell脚本还提供了一些特殊变量可以用来获取所传递参数的信息,如传递参数个数的${#}、所有参数组成的${*}和所有参数组成的${@}。 例如: ``` #!/bin/bash echo "There are $# parameters." echo "All parameters are ${*}." echo "All parameters are ${@}." ``` 执行: ``` ./test.sh hello world 123 ``` 输出: ``` There are 3 parameters. All parameters are hello world 123. All parameters are hello world 123. ``` 3. 命令行传参: 在执行Shell脚本时直接通过“sh test.sh 参数1 参数2…”的方式传参。这种方式需要注意空格和引号,可以使用双引号保留参数中的空格。 例如: ``` #!/bin/bash echo "The first parameter is $1 and the second parameter is $2." ``` 执行: ``` sh test.sh "hello world" 123 ``` 输出: ``` The first parameter is hello world and the second parameter is 123. ``` 总结:以上三种方式Shell脚本传参的常用方法,通过具体的需求来决定选用哪种方式,以达到最好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值