首页 > 系统相关 >Linux-shell编程(一)

Linux-shell编程(一)

时间:2023-03-01 19:46:57浏览次数:40  
标签:shell Linux 编程 devops sh scripts m01 root

shell编程(一)

一、概述

shell命令解释器:bash编程

命令解释器
bash 目前应用最广泛一款命令解释器,红帽系列(默认),Debian,Ubuntu, BASH全称: Bourne-Again SHell
dash 一般debian/ubuntu系统默认的, 运行脚本推荐使用
csh,tcsh 一些unix系统使用
zsh 功能更多,支持更多的插件,可以更好看。

温馨提示

shell脚本(.bash,.sh),运行在ubuntu中的时候,不推荐使用sh运行,推荐使用bash运行

二、编程语言分类(按照执行方式)

编程语言分类 说明
解析型:直接解析类 shell,python,php, 书写成文件后,可以通过对应的解释器直接运行。
编译型:需要编译后运行 C,C ,Java(maven),Golang. 下载好源代码,必须要进行编译生成可以运行的命令。

三、编程环境准备

修改vimrc文件,达到控制vim创建,编辑文件的动作

  • 当前用户家目录下 ~/.vimrc
  • 放在/etc/vimrc里面
[root@m01 ~]# cat /etc/vimrc
#最后添加这一块
#搜索的时候忽略大小写
set ignorecase 
#设置条件创建.py .sh 文件的时候 使用SetTitle函数
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2,"##############################################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:wh")
call setline(6, "# Desc:")
call setline(7,"##############################################################")
endif
endfunc

#新增sh的时候,就会有默认的备注
[root@m01 /server/scripts/devops-shell]# cat 1.sh 
#!/bin/bash
##############################################################
# File Name:1.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

四、shell脚本执行方式

1.概述

应用 说明
通过sh或bash 书写脚本后,最常用的方式
在其他非红帽系统中,建议使用bash运行脚本
通过. (点)或source 加载/生效配置文件(环境变量,别名)
常用:可以用来实现include功能,把其他脚本引入到剧本中
通过相对或绝对路径 我们一般不推荐使用这种,一般都是系统脚本/服调用的脚本,脚本需要加上执行权限才能用
输入重定向符号 不推荐使用.

2.详解

2.1 sh或bash

[root@m01 /server/scripts/devops-shell]# cat show_hostname.sh
#!/bin/bash
##############################################################
# File Name:show_hostname.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

hostname

[root@m01 /server/scripts/devops-shell]# sh show_hostname.sh
m01

2.2 .或source

[root@m01 /server/scripts/devops-shell]# . show_hostname.sh
m01

2.3 相对或绝对路径

给脚本加上执行权限

系统/服务调用某个脚本的时候这样用

[root@m01 /server/scripts/devops-shell]# chmod +x show_hostname.sh 
[root@m01 /server/scripts/devops-shell]# ./show_hostname.sh 
m01

2.4 使用重定向符号执行脚本

[root@m01 /server/scripts/devops-shell]# sh < show_hostname.sh 
m01

3. #! 符号定义

并非注释的意思,写在脚本开头

用于指定脚本默认的命令解释器

命令解释器 写法
bash #!/bin/bash
python #!/usr/bin/python2 或 /usr/bin/env python2

五、变量

1.概述

变量variable变化

查看变量内容 $变量名字

#变量定义
[root@m01 ~]# var=test
#变量取值
[root@m01 ~]# echo $var
test

关于变量的本质:

变量内存中的一块空间,变量名字--->内存空间地址

2.变量命名

变量命名要求:

1.不能以数字开头

2.不能以特殊符号开头,可以以"_"开头

3.推荐字母开头

变量的命名方式;

  1. 驼峰方式
  2. 现代式:单词(小写)+ "_下划线"连接 推荐

3. 变量分类

分类 说明
普通变量(局部变量) 我们在脚本中通过var=形式创建就是普通变量
环境变量(全部变量) 一般都是系统创建的,PATH
特殊变量 shell脚本,命令

3.1 普通变量

[root@m01 ~]# var=test
[root@m01 ~]# echo $var
test

温馨提示:

$与${} 一致,可以用于取值

$变量

${变量} 指定变量名字

3.2 环境变量

全局变量,1处定义,处处使用

大部分都是系统定义

env   #可以查看系统的变量
export
declare
环境变量名字 含义 应用场景
PATH 记录命令位置的环境变量,运行命令的时候bash会在PATH的 路径中查找 通过二进制包或编译安装软件, 增加新的命令路径
LANG 系统语言与字符集 Language 中文 LANG=zh_CN.UTF8 LANG=en_US.UTF8 修改语言字符集
PS1 命令行格式 修改命令行格式,生产环境不推 荐修改.
UID或EUID 用户的uid,用于判断当前用户是否为root 用于脚本判断用户是否root.
HOSTNAME 主机名
history命令 历史命令相关
HISTSIZE history 命令记录最多多条指令, 生产环境尽量少
HISTFILESIZE history 历史记录文件的大小 ~/.bash_history 生 产环境尽量少
HISTCONTROL 控制历史命令记录或不记录哪些内容 生产环境 ignorespace 以空格开头的命令 不记录
HISTFILE 指定历史命令的记录文件的名字和位置.默认当前用户家目 录 .bash_history 未来安全优化配置 或 手写跳 板机/行为审计
IFS 类似于awk -F 指定分隔符(指定每一列的分隔符) 一般与循环配合读取文件内容
TMOUT 超时自动退出时间
3.2.1环境变量相关文件及目录
文件或目录 说明
/etc/profile 全局生效,存放函数,环境变量。存放别名
/etc/bashrc 全局生效,存放别名。
~/.bashrc 局部生效
~/.bash_profile 局部生效
/etc/profile.d/ 目录,每个用户登录的时候(远程连接与su切换),加载目录下面.sh结尾 的文件.
设置一些登录登录后提示,变 化.
3.2.2 书写脚本每次用户登录后显示系统的基本信息
分析:
找出每个步骤对应的命令
创建变量,存放命令结果
把变量的结果输出
测试后放在/etc/profile.d/目录下.sh结尾

[root@m01 /server/scripts/devops-shell]# cat login.sh 
#!/bin/bash
##############################################################
# File Name:login.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################


#1.vars
hostname=`hostname`
ips=`hostname -I`
mem_total=`free -m |awk 'NR==2{print $2}'`
mem_ava=`free -m |awk 'NR==2{print $NF}'`
sys_load=`top -bn1  |awk -F"[ ,]+" 'NR==1{print $(NF-2),$(NF-1),$NF}'`

#2.print 
cat <<EOF
主机名: $hostname
ip地址: $ips
总计内存: $mem_total
可用内存: $mem_ava
系统负载: $sys_load
EOF

#拷贝脚本到/etc/profile或者做软链接过去
[root@m01 ~]# ll /etc/profile.d/login.sh 
-rw-r--r-- 1 root root 531 Feb 23 11:24 /etc/profile.d/login.sh

[root@m01 /server/scripts/devops-shell]# su - root
Last login: Thu Feb 23 11:24:15 CST 2023 from 10.0.0.1 on pts/1
主机名: m01
ip地址: 10.0.0.61 172.16.1.61 
总计内存: 972
可用内存: 619
系统负载: 0.00 0.01 0.05

补充:

这个脚本有点小问题,希望只有登录后提示,切换用户的时候不要提示。

判断两个变量是否存在即可,存在表示远程登录.不存在就切换用户.
SSH_CLIENT=10.0.0.1 3399 22
SSH_TTY=/dev/pts/

[root@m01 /server/scripts/devops-shell]# env|grep SSH_CLIENT
SSH_CLIENT=10.0.0.1 54969 22

3.3特殊变量

特殊变量分类
位置相关的特殊变量
状态相关的特殊变量
变量子串
变量扩展
3.3.1位置变量
位置的特殊变量 含义 应用场景
$n(数字) 脚本的第n个参数 取出脚本所有参数
$0 脚本的名字 用于输出脚本的格式或帮助的时候。用于错误提示输出帮 助。
$# 脚本参数的个数 一般与判断结合,检查脚本参数个数。
$@ 取出脚本所有参数 数组中或循环中。
$* 取出脚本所有参数 数组中或循环中。
3.3.1.1 $n
[root@m01 /server/scripts/devops-shell]# cat vars.sh 
#!/bin/bash
##############################################################
# File Name:vars.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本参数个数:$#"
[root@m01 /server/scripts/devops-shell]# sh vars.sh 1 2
脚本第1个参数:1
脚本第2个参数:2
脚本参数个数:2


#案例:执行脚本的时候输入用户名,判断用户名是否存在
[root@m01 /server/scripts/devops-shell]# cat check_user.sh 
#!/bin/bash
##############################################################
# File Name:check_user.sh
# Version:V1.0
# Author:wh
# Desc: 判断用户存不存在
##############################################################


user=$1

#判断是否存在

id $user

#
echo "提示:出现uid,gid表示存在,出现no such表示不存在"
[root@m01 /server/scripts/devops-shell]# sh check_user.sh test
id: test: no such user
提示:出现uid,gid表示存在,出现no such表示不存在
[root@m01 /server/scripts/devops-shell]# sh check_user.sh root
uid=0(root) gid=0(root) groups=0(root)
提示:出现uid,gid表示存在,出现no such表示不存在
3.3.1.2 $n n大于9 会有什么问题 面试题
$10
大于9后,会表示$1+0
需要使用${}

[root@m01 /server/scripts/devops-shell]# cat 10.sh 
#!/bin/bash
##############################################################
# File Name:10.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

echo $1 $2  $3 $4 $5 $10 $11
echo $1 $2  $3 $4 $5 ${10} ${11}
[root@m01 /server/scripts/devops-shell]# sh 10.sh {a..z}
a b c d e a0 a1
a b c d e j k

3.3.1.3 $0
#案例:如果脚本执行出错了,需要我们输出脚本的使用帮助
[root@m01 /server/scripts/devops-shell]# cat scripts_name.sh 
#!/bin/bash
##############################################################
# File Name:scripts_name.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

echo "help: $0 {start|stop}"
[root@m01 /server/scripts/devops-shell]# sh scripts_name.sh 
help: scripts_name.sh {start|stop}

#案例:判断脚本参数的格式,如果不等于1,则输出使用提示
[root@m01 /server/scripts/devops-shell]# cat check_param.sh 
#!/bin/bash
##############################################################
# File Name:check-param.sh
# Version:V1.0
# Author:wh
# Desc: 判断参数是否为1个
##############################################################

if [ $# -ne 1 ];then
	echo "help: $0 {该脚本只需要一个参数}"
	exit 6
fi

echo "脚本正常运行。。。。"
[root@m01 /server/scripts/devops-shell]# sh check_param.sh 1
脚本正常运行。。。。
[root@m01 /server/scripts/devops-shell]# sh check_param.sh 1 2
help: check_param.sh {该脚本只需要一个参数}

3.3.1.4 $# $@ $*
#案例:输出脚本所有参数,输出脚本参数个数
[root@m01 /server/scripts/devops-shell]# sh print_all_args.sh {a..z}
脚本参数个数: 26
脚本所有参数: a b c d e f g h i j k l m n o p q r s t u v w x y z
脚本所有参数: a b c d e f g h i j k l m n o p q r s t u v w x y z

补充:

$@与$*的区别:仅仅在加上双引号后才有区别

符号 共同点 区别
$@ 取出脚本所有的参数 加上双引号 会识别 合并在一起的参数,独立参数,正常的理解
$@ 取出脚本所有的参数 加上双引号 所有参数合并为1个参数
[root@m01 /server/scripts/devops-shell]# set "this is test" test1 test2
[root@m01 /server/scripts/devops-shell]# for i  in  "$*"
> do  
>     echo $i
> done
this is test test1 test2
[root@m01 /server/scripts/devops-shell]# for j  in  "$@"
> do  
>     echo $j
> done
this is test
test1
test2
3.3.2 状态变量
特殊符号
$? 上一个命令、脚本的返回值,0表示正确,非0即错误. 一般与判断检查命令 结果。
$$ 当前脚本的pid 一般写在脚本中获取 脚本pid.
$! 上一个脚本/命令(持续运行)的pid
$_ 上一个命令的最后一参数,其实下划线是个环境变量,记录了上一个命令、脚本的 最后一个参数. 使用esc+ .(点)
3.3.2.1 案例:输入任何一个命令并执行,检查这个命令的执行结 果是否正确。
[root@m01 /server/scripts/devops-shell]# cat check_cmd.sh 
#!/bin/bash
##############################################################
# File Name:check_cmd.sh
# Version:V1.0
# Author:wh
# Desc: 检查输入的命令是否执行成功
##############################################################

cmd="$*"

if [ $# -ne 1 ];then
        echo "help: $0 {该脚本只需要一个参数}"
        exit 6
fi


#执行命令
$cmd &>/dev/null

#判断
if [ $? -eq 0 ];then
	echo "$cmd  运行成功"
else
	echo "$cmd  运行失败"

fi
[root@m01 /server/scripts/devops-shell]# sh check_cmd.sh ls
ls  运行成功
[root@m01 /server/scripts/devops-shell]# sh check_cmd.sh aaa
aaa  运行失败
3.3.3 变量子串

变量子串 parameter expension变量扩展 格式

${变量},写为$变量形式无法识别

作用:用于对变量处理。(统计变量中字符串数量,对变量内容进行替换,删除。。。)

应用:可以不用,如果使用效率高,格局打开.

变量子串 parameter表示变量名字 含义
基础
${paramter} $para 变量取值
\${#paramter} 统计字符长度(变量中有多少个字符)
删除(开头,结尾) word表示要删除的内容
$ 从变量左边开始删除,按照最短匹配删除
$ 从变量左边开始删除,按照最长匹配删除
$ 从变量右边开始删除,按照最短匹配删除
$ 从变量右边开始删除,按照最长匹配删除
截取(切片) 类似于 cut -c
$ 从下标是5字符开始向后截取
$ 从下标是5字符开始向后截取2个字符
替换 阉割版的sed
$ 把word替换为replace 仅替换第1个
$ word替换为replace 替换全部
3.3.3.1 统计字符串长度
[root@m01 /server/scripts/devops-shell]# var=test
[root@m01 /server/scripts/devops-shell]# echo ${#var}
4
3.3.3.2 删除变量中的内容
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var#test}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var##test}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var#*t}
esttest123123
[root@m01 /server/scripts/devops-shell]# echo ${var##*t}
123123
3.3.3.3 截取
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var:4}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var:4:4}
test
[root@m01 /server/scripts/devops-shell]# echo ${var:4:5}
test1
3.3.3.4 替换
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var/t/-}
-esttest123123
[root@m01 /server/scripts/devops-shell]# echo ${var//t/-}
-es--es-123123
3.3.3.5 面试题:要求:bash for循环打印下面这句话中字母数不大于6的单词
[root@m01 /server/scripts/devops-shell]# cat for.sh 
#!/bin/bash
##############################################################
# File Name:for.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################


str="I am wh  welcome to Study Linux"

for word in $str
do
	if [ ${#word} -le 6 ];then
		echo ${word}
	fi
done
[root@m01 /server/scripts/devops-shell]# sh for.sh 
I
am
wh
to
Study
Linux


#awk书写
 [root@m01 /server/scripts/devops-shell]# echo "I am wh  welcome to Study Linux"|xargs -n1|awk   'length($1)<=6'
I
am
wh
to
Study
Linux
#length() awk函数用于统计某一列或整行的字符数量


[root@m01 /server/scripts/devops-shell]# echo "I am wh  welcome to Study Linux"|awk  -vRS="[ .]"  'length($1)<=6'
I
am
wh

to
Study
Linux

补充:

# eq
# ne
# lt less than <
# le less equal <=
# gt great than >
# ge great equal >=
3.4 变量扩展
格式 含义
$ 变量parameter没定义或为空,把word作为默认值,不修改变量内容(输出)
$ 变量parameter没定义或为空,把word作为默认值,修改变量内容
$ 变量parameter没定义或为空,显示word,错误输出
$ 变量parameter没定义或为空,则啥也不做,否则把word替换变量内容

4. 变量赋值

4.1 变量赋值语句

赋值方法 格式 应用场景
直接赋值 var=test 大部分时候使用
命令结果赋值 hostname=hostname 获取命令的结果`` 或$()
脚本传参(通过脚本命令行传参进行赋 值) user_name=$1 脚本的第1个参 数 一般用于命令行内容传入脚本中. 不想设置太多交 互.
read交互式赋值 通过read命令实现 与用户有个交互过程.
读取文件内容赋值给变量 脚本读取文件的时候使用.
4.1.1 read
read通过交互式的方式进行赋值
-p 交互的时候提示信息。
-t 超过这个时间没有操作,则自动退出.
-s 不显示用户的输入.记录密码才用.
[root@m01 /server/scripts/devops-shell]# cat read.sh 
#!/bin/bash
##############################################################
# File Name:read.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################

read -p "请输入手机号:" phone
echo "您输入的手机号是:"$phone

[root@m01 /server/scripts/devops-shell]# sh read.sh 
请输入手机号:123456
您输入的手机号是:123456

标签:shell,Linux,编程,devops,sh,scripts,m01,root
From: https://www.cnblogs.com/world-of-yuan/p/17169451.html

相关文章

  • Linux-shell编程(二)
    shell编程(二)一、运算1.运算符运算符含义+加-减*乘/除%取余^或**幂、指数i=i+1i++计算次数j=j+j+=求和,累加&&并且,前一个......
  • 【离线数仓环境搭建】安装linux及安装JDK
    创建新的虚拟机配置网络    安装vimsudoyuminstall-yvim 修改免密sudovim/etc/sudoers(执行安装命令的时候,不再需要输入密码)  查看防火墙状态......
  • Linux-shell编程(三)
    shell编程(三)一、循环1.循环概述循环类型格式说明for循环for变量in清单(列表);do命令;donefor((i=1;i<=10;i++));doecho$i;done最常用的循环w......
  • Linux下的rsync远程增量备份详解
    (Linux下的远程增量备份详解)一、rsync工具介绍1.rsync工具简介rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具RemoteSync可以远程同步,支持本地复制,或者......
  • Linux系统的进程管理
    (Linux系统的进程管理)一、系统进程介绍1.进程概念进程process是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的......
  • Linux通过Tomcat部署war包
    Linux通过Tomcat部署war包​ 前提:Linux上已经安装好tomcat、jdk等环境​ 将war包丢到服务器上​ cd到tomcat安装路径下的webapps/ROOT/下,删除里面的所有文件:......
  • Linux操作命令(七) 1.cut命令 2.paste命令 3.tr命令
    1、cut命令常用参数参数描述-b以字节为单位进行分割-c以字符为单位进行分割-d自定义分隔符,默认为制表符-f自定义字段--complement抽取整个文本......
  • Linux关闭防火墙
    Linux虚拟机关闭防火墙是不安全的,但在仅主机的模式下是没问题的,关闭防火墙是为了让虚拟机集群可以相互访问。命令:serviceiptablesstop验证:serviceiptablesstatus显......
  • 如何确定我的 python shell 是以 32 位还是 64 位执行的?
    如何从shell内部判断shell处于什么模式?我试过查看平台模块,但它似乎只是告诉你“用于可执行文件的位架构和链接格式”。我的二进制文件被编译为64位(我在OSX10......
  • java AES加密、解密(兼容windows和linux)
     1.准备工作2018年10月24日10点46分importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKe......