赞
踩
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学(运维人员)
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bash/shell
( 重 点\默认 ),流行的还有/bin/sh
、/bin/bash
、/usr/bin/sh
、/usr/bin/bash
、/bin/tcsh
、/bin/csh
查看流行shell
cat /etc/shells
当前系统使用的Shell
echo $SHELL
文件名.sh
.sh
是linux下bash shell 的默认后缀
指定告知系统当前这个脚本要使用的shell解释器
#!/bin/bash
创建Shell文件
touch hello.sh
编辑Shell文件
- #!/bin/bash
- echo "Hello World"
执行脚本
- bash ./hello.sh
- sh ./hello.sh
更简单的执行方式,因为我们知道当前就在bash下面,所以可以直接执行文件
./hello.sh
此时你会发现,报错:-bash: ./hello.sh: Permission denied
,这是因为没有权限,我们来查看权限
ll hello.sh # -rw-r--r--. 1 root root 31 Jun 21 05:41 hello.sh
接下来我们给他权限
chmod +x hello.sh
此时你会发现,文件变了颜色,所有可执行文件都会变颜色,变成绿色,执行文件
./hello.sh
扩展执行方案:
第一种:bash ./hello.sh
和 sh ./hello.sh
第二种:source hello.sh
和 . hello.sh
两种运行的方式差异性在于,第一种是在子bash环境下运行,而第二种是在当前bash环境下运行,我们通过运行type source
可以看到 source is a shell builtin
(source 是 shell 内嵌)
我们执行ps -f
可以查看当前bash环境,创建一个子bash,继续通过ps -f
查看,在当前子bash环境下,你依然可以运行shell文件
从结果上来看,两者好像没有什么区别,但是如果引入更多知识,例如变量:如果子shell中设置的当前变量,父shell是可不见的
变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如:age = 20
全局变量和局部变量的区别
全局变量:层层嵌套的子bash依然可以访问
局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢
$HOME 、$PWD 、$SHELL 、$USER
查看当前所有的全局系统变量env
查看当前所有的变量set
(包含全局和局部的,系统的,用户的)
定义变量:变量名=变量值
$
符号,但是使用时候需要添加温馨提示
查看定义的变量是全局还是局部
全局:
env | grep 变量名
局部:
set | grep 变量名
当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量
如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export
导出为一个全局变量
export 变量名
温馨提示
再子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加
export
也依然不会影响到父bash环境
我们可以在hello.sh
的脚本中去调用全局和局部变量
- #!/bin/bash
- echo $txt
温馨提示
在shell脚本中使用变量,同样遵循全局和局部变量的规则
$((1+1))
或者$[1+1]
的形式在shell中,只读变量相当于是常量,定义之后不允许修改。定义规则
readonly 变量名=值
变量定义之后是可以撤销的,使用unset 变量名
就可以撤销了
温馨提示
变量是可以撤销的,但是只读变量是不可以撤销的
在Shell中,存在一些特殊变量,他们具有特殊的意义
$n
代表接受参数,n
是数字,代表在执行脚本时候传递的参数数量,例如$1-$9
代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如${10}
。比较特殊的是$0
,代表当前脚本名称
- #!/bin/bash
- echo '======$n====='
- echo 1st:$1
- echo 2st:$2
- echo 3st:$3
- echo $0
$#
获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性
- #!/bin/bash
- echo '=====$#====='
- echo 1st:$1
- echo 2st:$2
- echo 3st:$3
- echo $#
$*
和$@
$*
和$@
非常相似,都代表命令行所有的参数,但是$*
把参数看成是一个整体,例如123 456
。而$@
把每个参数区分对待,例如[123,456]
注意:在没有循环遍历时候,两者效果一致
- #!/bin/bash
- echo '=====$n====='
- echo 1st:$1
- echo 2st:$2
- echo 3st:$3
- echo '=====$*====='
- echo $*
- echo '=====$@====='
- echo $@
$?
最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,有命令自己决定),则证明上面命令不正确了
- [root@localhost scripts]# vim hello.sh
- [root@localhost scripts]# echo $?
- 0
- [root@localhost scripts]# hello.sh
- -bash: hello.sh: command not found
- [root@localhost scripts]# echo $?
- 127
- [root@localhost scripts]#
我们将Shell当成一门编程语言来学习,那么就一定需要有运算符
在Shell中,还存在expr
表达式,可以用于做运算
在Shell中,运算需要使用$((a+b))
或者$[a+b]
的形式
expr
- expr 10 + 10
- expr 10 - 10
- expr 10 \* 10
温馨提示
运算符前后要添加空格
如何要赋值给一个变量,需要命令替换
- a=$(expr 10 + 10)
- a=`expr 10 + 10`
$((a+b))
或者$[a+b]
- $((10+10))
- $[10+10]
计算 (5+4) * 10
的值
s=$[(5+5)*10]
创建add.sh
,在执行的时候,通过传递参数的形式实现加法效果
- #!/bin/bash
- sum=$[$1 + $2]
- echo sum=$sum
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。