当我们要在多台主机上输入多段代码时,常规的一台一台操作会耗费大量的时间和精力。有一种解决办法为批量操作。将所有的指令集合到文件中,通过文件的使用来间接使用文件中的指令,达成需要的效果。这就是脚本的使用。
什么是Shell脚本:
命令、变量和流程控制语句等有机的结合起来。 shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件。
第一部分:脚本调用:
那么首先我们下来看一下调用脚本的几种方式:
那么同是脚本调用,看起来效果也都一样,有没有什么区别呢?我们将脚本内容改为会一直执行的程序,再来观察:
发现:给脚本可执行权限后,再通过脚本名字直接使用,当脚本中有程序时,会另起一个新的shell去运行脚本中的指令程序。
调用脚本时我们也可以使用sh -x 脚本名
来进行调试,当脚本执行出错时,会告诉我们哪一步出了问题。
第二部分:变量:
1.变量的定义
变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地
址可以存储 Script 运行时可更改的程序信息
在 shell 中变量是不能永久保存在系统中的,必须在文件中声明
2.变量名称的规
变量名称中通常包含大小写字字母,数字,下划线(不是必须)**
3.在 shell 脚本中变量的种类
在 shell 中变量分为环境级变量,用户级变量,系统级变量
环境级变量只在当前 shell 中生效, shell 关闭变量丢失
用户级变量写在用户的骨文件中,只针对当前用户生效
系统级变量被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
/etc/skel/ 中有用户环境变量配置文件 ls -a ##查看
shell 脚本中变量的定义方法
环境级
export A=1 ###直接在shell界面输入
用户级
vim ~/bash_profile ###在当前用户配置文件中写入
export A=1
echo $A
su - student ###切换用户后失效
echo $A
系统级
vim /etc/profile ###直接写在系统配置文件中
export A=1
刷新 : source 配置文件
声明变量:export A=1 ,将其在shell中共享
.bashrc ###shell环境设定
.bash_profile ###用户环境设定
.bash_logout ###退出时执行的指令
/etc/profile ###全局配置文件
env ###系统全部的变量
echo $PS1 ###shell的行头变量
PS1="" ###改变shell行头的变量 【改为空行时可以使用pwd显示路径
su - 用户 ### -为切换用户时加载环境配置
su 用户 ### 切换用户不加载环境配置
vim /etc/profile
export A=1
echo $A
su student
echo $A
exit
su - student
echo $A
##################加 - 时切换用户会加载全局配置
Linux中元字符:由自己功能的符号: # $ % @ & *
转译单个字符:
"" 弱引用:不能引用: ` \ ! $
''强引用,可以引用所有
${} 变量声明
echo ${A}b ###声明A为变量 ###echo $Ab将Ab看作一个字符串
a=1
echo $a
echo $ab
echo ${a}b
定义数组:a=(1 2 3 4)
echo $a
echo ${a[0]}
echo ${a[1]}
echo ${a[*]}
$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三串字符串
$# 脚本后所跟字符串的哥数
$* 脚本后跟的所有字符串,模式为“ 1 2 3 ”
&@ 脚本后跟的所有字符串,模式为“ 1”“2”“3”
写一个脚本:
echo \$0 is $0 ###输出文件名
echo \$1 is $1 ###脚本后第一串字符
echo \$2 is $2 ###脚本后第二串字符
echo \$3 is $3 ###脚本后第三串字符
echo \$# is $# ###脚本后面有几串字符
echo \$* is $* ###执行一次
echo \$@ is $@ ###多次执行
echo \$\$ is $$ ###当前进程的pid ###给脚本+x权限,绝对路径运行,ctrl+z挂到后台,ps f 查看pid
$*和$@的区别:
将@改为 *查看结果
kill -9 $$ 关闭当前shell 【相当于kill -9 进程pid】
最后:交互式变量:
read:交互式定义变量
#!/bin/bash
read -p "please input IP:" TARGET
echo "$TARGET"
【调用指令】
`` ###通用
$() ###shell中使用
举例: echo time is `date` | echo time is $(date)
写一个perl脚本,调用$()不执行
#!/usr/bin/perl
print `date` 或者 print $(date)
$? ###命令退出值
执行一条命令,然后echo $? 得到退出值。可以百度查看退出值含义【0为正确】
退出值可以修改: exit 退出值