shell编程(一)

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值