系统集成08-使用Shell脚本

系统集成08-使用Shell脚本

1 Shell基础介绍

  1. Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
  2. Shell将用户输入的命令并且把它们送到内核去执行,然后返回执行结果
  3. Shell是可编程的,它允许用户编写由Shell命令组成的程序

查看系统默认安装的shell:

cat /etc/shells

1.1 shell脚本

在Unix/Linux里,一个程序/命令只做好一件事,复杂的问题可以通过多个命令的组合来解决, 形式最简单的Shell脚本就是一系列命令构成的可执行文件,并可以被其他脚本复用

shell脚本的执行

对于脚本文件,我们有两种执行方式:

  • sh script_name.sh
  • ./script_name.sh

如果某个Shell脚本可执行,则可以通过在命令行中输入其名称调用, 被成功调用的前提是,脚本所在路径包含在$PATH变量中

echo $PATH	#查看&PATH变量
PATH=$PATH:/New/path	#修改PATH变量
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/New/path 	#查找具体某个命令/脚本的路径

后台执行:

当前命令行界面存在则会一直执行:

./my_script.sh &

当前命令行界面不存在也会一直执行:

nohup ./my_script.sh &

2 Shell编程基础

Linux中的文本流

文本流存在于Linux的每一个进程中. Linux的每个进程启动时,会打开三个文本流的端口:标准输入、标准输出、标准错误, 这三个端口对应着一个程序的输入、输出和异常的抛出

输出重定向

某些情况下,我们需要保存程序的输出,此时就可以通过重定向,将程序的输出保存到文件中

  1. 将标准输出定向到文件中(覆盖):

    ls>dir_log
    
  2. 将标准输出追加到文件中:

    ls>>dir_log
    

输入重定向

与输出重定向类似,输入重定向是把程序的标准输入进行重新定向

  1. 输入重定向:

    command<inpuptfile
    

    将右边的文件作为标准输入,然后传入左边的命令

  2. 内联输入重定向:

    command<<marker
    

    输出重定向需要文件,而内联输入重定向可以使用即时输入的文本作为标准输入,传入左边的命令, “marker”作为标志,表示标准输入的开始和结束,自身不包含在标准输入里

管道

有时需要将一个命令的输出连到另一个命令的输入,如果用重定向实现会较复杂,管道(|)就像现实中的水管一样,可以连接两个命令的输入和输出,甚至是串联多个命令

管道实际上是进程间通信(IPC)的一种方式

command1 | command2 | command3

Shell中的字符

和其他编程语言一样,Shell也有一些保留字(特殊字符),在编写脚本时需要注意

字符 说明
# 注释
' 字符串引用
\ 转义
/ 路径分隔
! 反逻辑

变量

  1. 在LinuxShell中,变量主要有两大类:

    • 环境变量
    • 用户定义变量
  2. 每种类型的变量依据作用域不同,又分为全局变量和局部变量

    • 全局变量作用在整个Shell会话及其子Shell
    • 局部变量作用在定义它们的进程及其子进程内
  3. 查看变量

    • 使用printenv查看全局变量
    • 使用set查看某个特定进程中的所有变量,包括局部变量、全局变量以及用户定义变量
  4. 修改变量

    • 在.bash_profile或.bashrc中添加export语句,永久修改变量
  5. 使用变量:

    • 变量命名规则:
      • 变量名由数字、字母、下划线组成
      • 必须以字母或者下划线开头
      • 不能使用Shell里的关键字

扩展变量

在以下示例中,如果不使用花括号,Bash会将$FIRST_$LAST解释为变量$FIRST_后跟变量$LAST,而不是由_字符分隔的变量$FIRST和$LAST

变量的赋值与输出

name=Euler
time=‘2020202’
echo “My nameis $name,today is
$time”
read name
echo “Hello, $name, welcome!”

条件语句

if command
	then
	commands
fi

多分支判断语句

case variable in
	pattern1 | pattern2) commands1;;
	pattern3) commands2;;
	*) default commands;;
esac

循环语句

for:

for var in list
	do
		commands
	done

while:

sum=0; i=1
while((i<=100))
do
	let"sum+=i"
	let"i+=2"
done
	echo "sum=$sum"
posted @ 2023-05-06 16:36  Qurare  阅读(168)  评论(0编辑  收藏  举报