一、shell脚本的三种执行方式
1、使用解释器执行脚本中的命令
[root@test day01]# sh test.sh
Hello Word!!
[root@test day01]# bash test.sh
Hello Word!!
2、使用路径方式执行脚本中的命令
两种:当前路径
绝对路径
[root@test day01]# chmod +x test.sh #给shell添加执行权限
[root@test day01]# ./test.sh #当前路径
Hello Word!!
[root@test day01]# /server/scripts/day01/test.sh #绝对路径
Hello Word!!
3、使用source和.执行脚本中的命令
source区别于上面两种执行方法,source是直接在父shell中运行脚本,上面两种是在子shell中运行脚本,如果在脚本中定义变量,子shell中可以继承父shell中的变量,父shell不能使用子shell中的变量
[root@test day01]# source test.sh
Hello Word!!
[root@test day01]# . test.sh
Hello Word!!
其他几种执行方式 (不常用)
[root@test day01]# bash < test.sh
Hello Word!!
二、变量
1、变量的分类
环境变量(全局变量)对于系统所有的bash生效 系统默认定义好的一般都是大写
普通变量(局部变量)自己定义的变量 一般都在脚本中定义
按照生存周期分类:
临时变量:直接在当前shell中定义的变量,重启或者重新链接都失效
永久变量:写入到 /etc/profile 文件中,source可以直接让文件生效,或者重新链接一下xshell
2、定义变量的方式
ps axuf 查看当前shell
变量名称=变量的值 只在当前的shell中生效
[root@test day01]# cat test.sh
#!/bin/bash
name=hehe
echo $name
[root@test day01]# sh test.sh
hehe
export 变量名称=变量的值 在所有的shell中生效
[root@test day01]# cat test.sh
#!/bin/bash
export name=hehe
echo $name
[root@test day01]# sh test.sh
hehe
三、和变量相关的配置文件
1、/etc/porfile (全局生效)
2、用户的变量文件,在文件中定义变量只对当前用户生效
/root/bashrc
/root/bash_profile
/etc/bashrc
如果同样的变量写入到上面几个文件中,则会覆盖profile中定义的变量
四、变量的定义方式
1、语法:
变量名称=变量的值
2、变量名称的定义方式:
字母、数字、下划线组合,以字母或者下划线开头,但是不能以数字开头,等号两端不能有空格
3、变量书写方式:
a、全大写NAME_AGE 系统默认的都是大写的
b、全小写 name_age
c、大驼峰写法:Name_Age 每个单词第一个字母大写
4、变量值的定义
a、数字的定义
必须连续的数字
b、字符串的定义
必须用 ' ' 或 " " 引起来
c、命令的定义
1、直接定义
[root@test day01]# test=ls
[root@test day01]# $test
test1.sh test.sh
2、命令执行后将结果复制给变量
[root@test day01]# test=`ls`
[root@test day01]# echo $test
test1.sh test.sh
5、shell重要的内置变量
$0 脚本名
$n n为数字,代表用户输入的第几个参数 #注意系统会把$10认为$1,需要用中括号括起来即${10}
$# 表示脚本传参的个数
$? 表示上一条命令的执行的结果,成功返回0,不成功则返回非0
$$ 表示脚本的pid
----------
$_ 表示获取执行脚本最后的一个值
$* 获取脚本的所有参数 在循环体中加上双引号将所有参数作为一个参数
$@ 获取脚本的所有参数 在循环体中加上双引号将所有参数作为独立的参数
6、变量的传参方式
a、直接传参:脚本名后直接加参数
b、赋值传参:直接在脚本中用$n接收传入的参数
c、read传参:在脚本中使用read -p
[root@test day01]# cat test.sh
#!/bin/bash
read -p '请输入您的名字: ' name
echo '名字='$name
[root@test day01]# sh test.sh
请输入您的名字: aaa
名字=aaa