当我们要在多台主机上输入多段代码时,常规的一台一台操作会耗费大量的时间和精力。有一种解决办法为批量操作。将所有的指令集合到文件中,通过文件的使用来间接使用文件中的指令,达成需要的效果。这就是脚本的使用。

什么是Shell脚本:

命令、变量和流程控制语句等有机的结合起来。 shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件。

第一部分:脚本调用:

那么首先我们下来看一下调用脚本的几种方式:

linux调用脚本执行java程序 linux怎么调用脚本_linux调用脚本执行java程序


那么同是脚本调用,看起来效果也都一样,有没有什么区别呢?我们将脚本内容改为会一直执行的程序,再来观察:

linux调用脚本执行java程序 linux怎么调用脚本_linux调用脚本执行java程序_02


linux调用脚本执行java程序 linux怎么调用脚本_Linux_03

linux调用脚本执行java程序 linux怎么调用脚本_脚本_04

发现:给脚本可执行权限后,再通过脚本名字直接使用,当脚本中有程序时,会另起一个新的shell去运行脚本中的指令程序。

调用脚本时我们也可以使用sh -x 脚本名 来进行调试,当脚本执行出错时,会告诉我们哪一步出了问题。

linux调用脚本执行java程序 linux怎么调用脚本_变量_05

第二部分:变量:

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显示路径

linux调用脚本执行java程序 linux怎么调用脚本_变量_06

su - 用户  ### -为切换用户时加载环境配置
su 用户    ###  切换用户不加载环境配置
vim   /etc/profile 
	export A=1 
echo $A
su student
echo $A
exit
su - student
echo $A
##################加 - 时切换用户会加载全局配置

linux调用脚本执行java程序 linux怎么调用脚本_字符串_07


linux调用脚本执行java程序 linux怎么调用脚本_脚本_08

Linux中元字符:由自己功能的符号: # $ % @ & *

转译单个字符:
"" 弱引用:不能引用: ` \ ! $
''强引用,可以引用所有

${} 变量声明
echo ${A}b ###声明A为变量 ###echo $Ab将Ab看作一个字符串

a=1 
echo $a
echo $ab
echo ${a}b

linux调用脚本执行java程序 linux怎么调用脚本_linux调用脚本执行java程序_09

定义数组:a=(1 2 3 4)
echo $a
echo ${a[0]}
echo ${a[1]}
echo ${a[*]}

linux调用脚本执行java程序 linux怎么调用脚本_字符串_10

$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

linux调用脚本执行java程序 linux怎么调用脚本_linux调用脚本执行java程序_11


linux调用脚本执行java程序 linux怎么调用脚本_linux调用脚本执行java程序_12

$*和$@的区别:

linux调用脚本执行java程序 linux怎么调用脚本_变量_13


将@改为 *查看结果

linux调用脚本执行java程序 linux怎么调用脚本_Linux_14

kill -9 $$  关闭当前shell   【相当于kill -9 进程pid】

最后:交互式变量:

read:交互式定义变量

#!/bin/bash
read -p "please input IP:" TARGET
echo "$TARGET"

linux调用脚本执行java程序 linux怎么调用脚本_脚本_15


linux调用脚本执行java程序 linux怎么调用脚本_字符串_16


【调用指令】
`` ###通用
$() ###shell中使用

举例: echo time is `date` | echo time is $(date)
写一个perl脚本,调用$()不执行
#!/usr/bin/perl
print `date` 或者 print $(date)

linux调用脚本执行java程序 linux怎么调用脚本_字符串_17


linux调用脚本执行java程序 linux怎么调用脚本_字符串_18

$? ###命令退出值

执行一条命令,然后echo $? 得到退出值。可以百度查看退出值含义【0为正确】

退出值可以修改: exit 退出值

linux调用脚本执行java程序 linux怎么调用脚本_变量_19