一、第一个shell脚本
打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。
输入一些代码,第一行一般是这样:
#!/bin/bash
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
echo命令用于向窗口输出文本。
二、单行、多行注释
(1)单行注释
以#开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,像这样:
# --------------------
# 这是一个注释
# author: 大侠
# slogan: 学的不仅是技术,更是梦想!
# --------------------
(2)多行注释
多行注释使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
三、运行Shell脚本有两种方法
(1)作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
# 使脚本具有执行权限
chmod 755 ./test.sh
# 执行脚本
./test.sh
(2)作为解释器参数
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh
/bin/python test.py
四、shell变量
(1)定义变量
shell中定义变量与python语言类似,语法如下:
name=[value]
如果value没有给出,变量将被赋值为空字符串。
注意:赋值等号两边不能有空格,这几乎和所有的变成语言都不一样。
变量名的命名规则同python:
- 英文字母,数字和下划线
- 首字符不能是数字
- 不能使用bash中的关键字(help命令查看保留关键字)
定义变量有多种形式
name=liyifeng
当值中不包含空格时,可以不需要引号。当值中需要包含空格时需要用引号包含。如果只是输出字符的字面值,单引号和双引号没有区别。当需要进行变量扩展等操作时,要使用双引号,详见shell引用。
# 没区别
info='helloworld'
info=helloworld
# 值有空格,必须要加引号。
info='hello world'
info=hello world
(2)使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
name=liyifeng
echo $name
也可以 echo ${name},
echo ${name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况。
注意:如果变量不存在,那么就把他替换成空字符串,所以不会报错。
(3)只读变量
(4)删除变量 unset
# 删除变量
unset name
五、变量作用域
(1)局部变量
局部变量在脚本或命令中定义,仅在当前shell进程中有效。
(2)全局变量
在当前shell中任何地方可以使用变量,且在子shell中也有效
通过命令 env 可以查看当前shell中的所有全局变量
要定义一个全局变量可以使用 export 命令,格式如下
export var=value
但是export定义的全局变量是临时的,当关闭执行定义的shell进程后,定义的变量就会被销毁,所以通过export定义的全局变量只能向下传递,也就是只能是父shell传递给子shell。
在外面访问不到info,因为通过export定义的全局变量只能向下传递,也就是只能是父shell传递给子shell。
那我们在主shell中定义一个全局变量,然后在子shell里test.sh中引用这个变量试试看(向下传递)~
info这个变量能打印出来!
那如何定义一个所有shell都可以访问的变量呢。本质上来讲没有一个这样的变量。但是我们可以通过启动shell时预定义全局变量来实现这个目的。也就是接下来我们要讲的环境变量。
(3)环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
环境变量本质上就是全局变量,只不过它是在启动终端(shell主进程)时通过执行初始化脚本预定义的。
启动终端后直接输入 env 命令 显示得所有的变量都是环境变量。要定义环境变量可以在以下文件中通过export定义:
- ~/.bashrc 只对当前用户的终端有效
- ~/.profile 只对当前用户的终端有效
- /etc/bash.bashrc 对所有用户的终端有效
注意:不同linux,不同终端启动文件有所不同,但是原理相同
我们将wangdaxia 追加到.bashrc文件里,然后我们每打开一个终端,他就会打印一个
想必大家应该都知道怎么定义环境变量了吧。
我们来操作一下。在 .bashrc文件中配置一个name变量
# 步骤一
cd /root
# 步骤二
vim .bashrc
然后我通过 env 查看全局环境变量, 看到了我刚才添加的环境变量name。
那在脚本里我也可以用啦。因为这个环境里面就有name变量啦。
我们在脚本里面引用这个环境变量。
然后执行这个脚本 发现这个name变量能引用到。完成啦。
下一节讲shell 数据类型、数组啦~