shell脚本编程规范

shell脚本编程规范

shell脚本语言,主要用于管理系统。不支持开发功能。

Python脚本语言,胶水语言,开发语言。

shell脚本的概述

●将要执行的命令按顺序保存到一个文本文件
●给该文件可执行权限
●可结合各种Shell控制语句以完成更复杂的操作

■Shell脚本应用场景

●重复性操作 、交互性任务、批量事务处理
●服务运行状态监控
●定时任务执行

一、shell脚本编程规范

1. 新建 脚本文件

[root@localhost opt]# vim firsh.sh
#!/bin/bash
#注释
read -p "请输入一个数字" sum
echo "sum=$sum"
~                 

2. 执行脚本方法

./ 脚本文件 //需要给脚本文件添加执行权限 chmod +X 脚本文件

sh 脚本文件

source 脚本文件 //使用这个方法执行脚本,会切换到执行之后的目录中

. 脚本文件 //使用这个方法执行脚本,会切换到执行之后的目录中

案例

[root@localhost opt]# sh first   //执行first 脚本
请输入一个数字123
sum=123

3. 重定向

在这里插入图片描述

在这里插入图片描述

案例

管道符号 |

同一条命令可以使用多个管道符号

[root@localhost opt]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
ttyy /bin/bash
[root@localhost opt]# 

案例 重定向输出

[root@localhost opt]# uname -p > kernel.txt
[root@localhost opt]# cat kernel.txt 
x86_64
[root@localhost opt]# uname -p >> kernel.txt
[root@localhost opt]# cat kernel.txt 
x86_64
x86_64
[root@localhost opt]# tar jcf /nonedir/etc.tgz/etc/ 2> error.log
[root@localhost opt]# cat error.log 
tar: 谨慎地拒绝创建空归档文件
请用“tar --help”或“tar --usage”获得更多信息。
[root@localhost opt]# 
[root@localhost opt]# cat < error.log 
tar: 谨慎地拒绝创建空归档文件
请用“tar --help”或“tar --usage”获得更多信息。

二、shell脚本变量揭秘

1. 自定义变量

自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,因此又称为本地变量。在编写shell脚本程序中,通常设置一些特定的自定义变量,以适应执行过程中的各种变化,满足不同的需要。

格式

2.变量名=变量值

[root@localhost opt]# Product=weixin
[root@localhost opt]# Version=6.0
[root@localhost opt]# 

3.查看和引用变量的值

[root@localhost opt]# echo $Product 
weixin
[root@localhost opt]# echo $Version 
6.0
[root@localhost opt]# 

4.变量赋值的特殊操作

4.1 双引号 " "**

双引导起到引用$作用,起界定位符的作用,特别是当要赋值内容中包含空格时,必须以双引号括起来,其他情况下双引号可以省略。

[root@localhost boot]# vseion=3
[root@localhost boot]# qq="\A$vseion"
[root@localhost boot]# echo $qq
\A3

4.2 单引号 ‘’**

单引号不引用变量,$

在单引导范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引导时,需使用“ ’ ” 符号转义,以免冲突。

[root@localhost boot]# echo '$num1'
$num1
[root@localhost boot]# num1=abc\'d
[root@localhost boot]# echo "$num1"
abc'd
[root@localhost boot]# 


4.3 反撇号 ` **

反撇号调用命令

[root@localhost boot]# ls -lh `which useradd`
-rwxr-x---. 1 root root 116K 1031 2018 /usr/sbin/useradd

[root@localhost boot]# num1=`grep "bash$" /etc/passwd`
[root@localhost boot]# echo "$num1"
root:x:0:0:root:/root:/bin/bash
ttyy:x:1000:1000:ttyy:/home/ttyy:/bin/bash
[root@localhost boot]# echo `grep "bash$" /etc/passwd`
root:x:0:0:root:/root:/bin/bash ttyy:x:1000:1000:ttyy:/home/ttyy:/bin/bash
[root@localhost boot]# 

需要注意的是,使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “ $() ” 来代替反撇号操作,以解决嵌套的问题。

[root@localhost boot]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
[root@localhost boot]# 

4.4 read 命令**

read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给变量。

选项 -p -t 只是设置提示信息与输入等待时间(单位默认为秒)

[root@localhost boot]# read -p "请输入一个数值" num
请输入一个数值123455
[root@localhost boot]# echo $num
123455
[root@localhost boot]# 

4.5 设置变量的作用范围**

局部变量:默认情况下,新定义的变量只在当前的shell环境中有效。

[root@localhost boot]# version=10
[root@localhost boot]# echo "$num$version"
12345510
[root@localhost boot]# bash
[root@localhost boot]# echo "$num$version"

[root@localhost boot]# exit
exit
[root@localhost boot]# echo "$num$version"
12345510
[root@localhost boot]# 

全局变量:使用内部命令export导出“全局变量”。可以同时使用多个变量名称作为参数(不需使用 “ $ ” 符号),变量名之间以空格分隔。

[root@localhost boot]# echo $num
123455
[root@localhost boot]# version=10
[root@localhost boot]# echo "$num$version"
12345510
[root@localhost boot]# bash
[root@localhost boot]# echo "$num$version"

[root@localhost boot]# exit
exit
[root@localhost boot]# echo "$num$version"
12345510
[root@localhost boot]# 
[root@localhost boot]# export num version
[root@localhost boot]# bash
[root@localhost boot]# echo "$num$version"
12345510
[root@localhost boot]# export KGC="www.kgc.com"
[root@localhost boot]# echo "$KGC"
www.kgc.com
[root@localhost boot]# 


4.6 数值变量的运算**

在Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令 expr 进行,基本格式如下所示。需要注意,运算符号与变量之间必须有至少一个空格。

运算符意义
++ - -增加及减少,可前置也可放结尾
\* / %乘法 除法 取余
+ -加法 减法
< <= > >=小于 小于等于 大于 大于等于
== !=等于 不等于
&位的与
^位异或
|位的或
&&逻辑的与
||逻辑的或
? :条件表达式
= += -= *= /= %= &= ^= <<= >>= |=赋值运算符 a+=1 相当于 a=a+1

需要注意的是乘法运算,注意不能仅使用 “ * ” 符号,否则将被当成文件通配符。

[root@localhost boot]# x=12
[root@localhost boot]# y=34
[root@localhost boot]# expr=$x+$y   //错误格式
[root@localhost boot]# expr= $x + $y
bash: 12: 未找到命令...
[root@localhost boot]# expr $x + $y
46
[root@localhost boot]# expr $x / $y
0
[root@localhost boot]# expr $x % $y
12
[root@localhost boot]# expr $x \* $y
408
[root@localhost boot]# expr $x - $y
-22
[root@localhost boot]# num=`expr $x + $y`
[root@localhost boot]# echo $num
46
4.7 expr

使用expr进行计算的时候,变量必须是整数,不能是字符串,也不能是小数,否则会出错(命令的退出状态为非0),如下所示

[root@localhost boot]# i=hei
[root@localhost boot]# expr $i + 58
expr: 非整数参数
[root@localhost boot]# ech $?

除了expr 命令之外,变量数值常见的命令还包括: (())、let 等。如果要执行简单的整数运算,只需要将特定对的算术表达式用“ $ (( ” 和 “ )) ” 括起来即可

[root@localhost boot]# bb=$((1+2**3-4))   //1加上2的3次方减去4等于5
[root@localhost boot]# echo $bb
5
[root@localhost boot]# 

三、特殊变量

3.1 环境变量配置文件

⑴source 命令

source 配置文件 或 . 配置文件 ,可以直接生效

⑵环境变量的配置文件

①录系统时,主要生效的环境变量配置文件有以下5个

/etc/profile

/etc/profile.d/*.sh

~/.bash_profile

~/.bashrc

/etc/bashrc

注意:/etc目录下的可以对所有用户生效

写在~目录下的只对当前用户生效,如写在临时用户目录下,就只对临时用户生效

②户退出时候调用

~/.bash_logout. 比如可以执行一些清除历史命令的操作

③ 其他配置文件

常见的如

~/.bash_history文件,历史命令保存文件
I hope all of us can learn to progress!

3.2环境变量概论

环境变量是指出于运行需要由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。
环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。

[root@localhost boot]# env   //查看当前用户的环境变量
XDG_SESSION_ID=2
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
version=10
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.75.5 53339 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/1
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
num=46
KGC=www.kgc.com
PWD=/boot
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
SSH_CONNECTION=192.168.75.5 53339 192.168.75.100 22
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。

[root@localhost opt]# ls -lh /opt/firsh.sh    //确定脚本位置
-rw-r--r--. 1 root root 38 716 03:15 /opt/firsh.sh
[root@localhost opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost opt]# PATH="$PATH=:/opt"
[root@localhost opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin=:/opt
[root@localhost opt]# firsh.sh
bash: /opt/firsh.sh: 权限不够
[root@localhost opt]# 


[root@localhost opt]# vim /root/.bash_profile
export HISTSIZE=300   //设置记录历史命令最多300条
[root@localhost opt]# history wc-l
bash: history: wc-l: 需要数字参数
[root@localhost opt]# history | wc -l
281
[root@localhost opt]# source /root/.bash_profile    //读取并执行程序
[root@localhost opt]# history | wc -l
283
[root@localhost opt]# 

3.3 位置变量

当执行命令行操作时,第一个字符表示命令名或脚本程序名,其余的字符串参数按照从左向右的顺序依次赋值给位置变量。

位置变量也称为位置参数,使用$1 、$2、$3 、 $4 …、$9表示。

$0 表示:命令或者脚本的本身

[root@localhost opt]# vim adder2num.sh
[root@localhost opt]# vim adder2num.sh
#!/bin/bash
sum=`expr $1 + $2`
echo "$1 + $2 =$sum"

[root@localhost opt]# sh adder2num.sh 12 34
12 + 34 =46
[root@localhost opt]# sh adder2num.sh 67 89
67 + 89 =156
[root@localhost opt]# 

3.4 预定义变量

预定义变量是由bash程序预先定义好的一类特殊变量。用户只能使用预定义变量,而不能创建新的预定义变量,不能直接为预定义变量赋值。预定义变量使用“ $ ”符号和另一个符号组合表示,较常用的几个预定义变量的含义如下:

  • $# : 表示命令行中位置参数的个数
  • $* : 表示所有位置参数的内容
  • $? :表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0数值表示执行出现异常。
  • $0 : 表示当前执行的脚本或程序的名称。
[root@localhost opt]# vim adder2num.sh 
[root@localhost opt]# sh adder2num.sh 12 39
12 + 39 =51
命令的名称adder2num.sh
命令的执行行数2
命令所在位置的内容 12 39
[root@localhost opt]# cat adder2num.sh 
#!/bin/bash
sum=`expr $1 + $2`
echo "$1 + $2 =$sum"
echo "命令的名称$0"
echo "命令的执行行数$#"
echo "命令所在位置的内容 $*"

[root@localhost opt]# 

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值