1.shell的变量
1.1.命名规则
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
1.2.变量类型
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,
其他shell启动的程序不能访问局部变量。
linux会启动一个bash或sh环境,它们定义的局部变量只会在这个bash或sh中有效。
[root@test shell-test]# a=10
[root@test shell-test]# echo $a
10
[root@test shell-test]# bash
[root@test shell-test]# echo $a
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,
有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
[root@test shell-test]# env
XDG_SESSION_ID=3
HOSTNAME=test
SELINUX_ROLE_REQUESTED=
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.249.1 50042 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/2
USER=root
[root@test shell-test]# echo $PATH
/usr/local/gala/sbin/:/usr/local/gala/sbin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@test shell-test]# bash
[root@test shell-test]# echo $PATH
/usr/local/gala/sbin/:/usr/local/gala/sbin/:/usr/local/gala/sbin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这些环境变量都写在文件里,在每个bash环境都会有
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,
有一部分是局部变量,这些变量保证了shell的正常运行
2.shell脚本的执行方式
[root@test shell-test2]# vim test.sh
#!/bin/bash
num1=10
echo "num1 is: "$num1
echo "num2 is: "$num2
[root@test shell-test2]# num2=20
bash 和 sh都是在当前bash环境启一个子进程运行脚本,所有没有num2
[root@test shell-test2]# bash test.sh
num1 is: 10
num2 is:
[root@test shell-test2]# sh test.sh
num1 is: 10
num2 is:
. 和 source都是在当前bash环境下运行,所有num1, 如果你在这个环境临时添加了环境变量,推荐用这俩个命令执行。
[root@test shell-test2]# . test.sh
num1 is: 10
num2 is: 20
[root@test shell-test2]# source test.sh
num1 is: 10
num2 is: 20
#给文件可执行权限,直接运行, 它也是启了一个子进程
[root@test shell-test2]# chmod +x test.sh
[root@test shell-test2]# ll
总用量 4
-rwxr-xr-x. 1 root root 52 9月 25 20:59 test.sh
[root@test shell-test2]# ./test.sh
num1 is: 10
num2 is:
#!/bin/bash 脚本前最好加上这一行,默认使用什么解释器去执行
也可以不要接末尾的.sh,最好还是接,知道只是一个什么类型的脚本。
3.位置变量和预定义变量
3.1.位置变量
位置变量: $1-$9,分别代表向脚本传递的参数,参数列表中的第1-9个参数
[root@test shell-test2]# vim test2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $5
echo $6
echo $7
echo $8
echo $9
传递几个参数接收几个,没有就输出空
[root@test shell-test2]# bash test2.sh 1 2 3
1
2
3
这里传递11个参数,只会输出9个,跟后面说的read的参数不一样。
[root@test shell-test2]# bash test2.sh 1 2 3 4 5 6 7 8 9 10 11
1
2
3
5
6
7
8
9
3.2.预定义的变量
$0 执行的文件名
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
[root@test shell-test2]# vim test3.sh
#!/bin/bash
echo $1
echo $2
echo "执行的文件名:"$0
echo "传递到脚本的参数个数:"$#
echo "显示Shell使用的当前选项:"$-
echo "显示最后命令的退出状态:"$?
[root@test shell-test2]# bash test3.sh 1 2
1
2
执行的文件名:test3.sh
传递到脚本的参数个数:2
显示Shell使用的当前选项:hB # 执行 $- 后, 表示使用 set 的 –h 和 –B 选项, 这时传入的参数是 hB
显示最后命令的退出状态:0 # 0是执行成功, 非0为不成功
perror 命令可以看状态码错误信息,不过要安装yum install mariadb-server -y,然后启动就行了systemctl start mariadb,
[root@test shell-test2]# perror 126
OS error code 126: Required key not available
MySQL error code 126: Index file is crashed
3.3.进程号预定义变量
[root@test shell-test2]# vim test4.sh
#!/bin/bash
echo "脚本运行的当前进程号:"$$
echo "后台运行的最后一个进程的id号:"$!
while true
do
echo 666
sleep 5
done
[root@test shell-test2]# bash test4.sh
脚本运行的当前进程号:2517
后台运行的最后一个进程的id号:
666
666
[root@test shell-test2]# ps aux|grep bash
root 1627 0.0 0.0 115648 2128 pts/2 Ss 18:43 0:00 -bash
root 1802 0.0 0.0 115544 2076 pts/2 S 19:29 0:00 bash
root 1815 0.0 0.0 115728 2196 pts/2 S 19:32 0:00 bash
root 2183 0.0 0.0 115544 2096 pts/0 Ss 21:39 0:00 -bash
#可以看到进程号
root 2517 0.0 0.0 113284 1412 pts/2 S+ 21:43 0:00 bash test4.sh
root 2520 0.0 0.0 112824 988 pts/0 S+ 21:43 0:00 grep --color=auto bash
3.4. $@和$*的异同
[root@test shell-test2]# vim test5.sh
#/bin/bash
echo "传递的参数作为一个字符串显示:$*"
echo "传递的参数作为一个字符串显示:$@"
for i in "$*"; do
echo $i
done
for i in "$@"; do
echo $i
done
~
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。而$*不会
如"$@ 和$*"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
[root@test shell-test2]# bash test5.sh 1 2 3 4 5
传递的参数作为一个字符串显示:1 2 3 4 5
传递的参数作为一个字符串显示:1 2 3 4 5
1 2 3 4 5
1
2
3
4
5