centos7 shell编程

Shell编程

简介

shell 是linux命令解释器,shell编程,就是Linux命令的组合;
centos6启动走init,centos7启动走systemd

格式

vim a.sh
在linux中,不同语句按顺序执行,语句之间可以不换行而用;隔开,对于linux,一切皆文件,我们将语句写进一个shell脚本中,可以通过换行表示另起一句

#!/bin/bash
cd /var/
ls
pwd
du -sh
du -sh *

第一行表示默认执行脚本 #!/bin/bash执行Bash #!/usr/bin/python3执行Python3

在这里插入图片描述
shell脚本运行方法有如下方法

  • bash filename
  • . filename
  • source ./filename

区别在于:

  1. bash与.执行会创建子进程,执行完后回到父进程
  2. source执行完后会停留在执行后的目录下,没有创建子进程
  3. bash运行不需要赋予权限,其余需要赋予读和执行的权限
    权限模型r 4;w 2;x 1

chmod r+x 1.sh
[root@localhost home]# vim 3.sh
在这里插入图片描述
保存后执行:
在这里插入图片描述
在这里插入图片描述

管道符与重定向

管道符用于连接两个应用进程,前一个的输出作为后一个的输入,还会创建一个管道进程
重定向用于将程序的输入或输出结果写进一个文件当中

管道符

在这里,可以展示一个管道连接:
在这里插入图片描述
另起一个终端查看进程14855执行情况
在这里插入图片描述

重定向

重定向有输入重定向和输出重定向:

 >、>>、 2>、&>、<
[root@localhost proc]# wc -l < /etc/passwd
44

read 交互式输入变量:

[root@localhost proc]# read var
123

echo {变量名}输出变量内容

[root@localhost proc]# echo $var
123

输入重定向:

[root@localhost proc]# cd /home
[root@localhost home]# vim a.txt
[root@localhost home]# read var2 < a.txt
[root@localhost home]# echo $var2
124

[root@localhost home]# ls
3.sh  a.txt  b.txt  c.txt  d.txt  tang
[root@localhost home]# cat 3.sh
#!/bin/bash

cat > /root/a.sh<<EOF
echo "hello bash"
EOF

标准输出重定向>,cat打开文件内容:

[root@localhost home]# echo $var2 > b.txt
[root@localhost home]# cat b.txt
124

错误输出重定向>> 2>:

[root@localhost home]# nocmd
bash: nocmd: 未找到命令...
[root@localhost home]# nocm 2> c.txt
[root@localhost home]# cat c.txt
bash: nocm: 未找到命令...

完全重定向&>:

[root@localhost home]# ls
a.txt  b.txt  c.txt  tang
[root@localhost home]# ls &> d.txt
[root@localhost home]# cat d.txt
a.txt
b.txt
c.txt
d.txt
tang

变量赋值

变量命名要求:字母数字下划线,数字不能开头
格式:
a=1
let a=1
a=$(ls /root)

[root@localhost home]# a=123
[root@localhost home]# cmd1='ls /root'
[root@localhost home]# cmd2=$(ls /root/)

赋值时=前后不能有空格,空格后不算变量的值

[root@localhost home]# string1=hello bash
[root@localhost home]# echo $string1
hello

如果变量值得内容有空格,则需将整个值用引号

[root@localhost home]# string1="hello bash"
[root@localhost home]# echo $string1
hello bash

如果值中既有括号,也有引号,则外引号与内部引号要有区别

[root@localhost home]# string2="hello 'world'"
[root@localhost home]# echo $string2
hello 'world'

[root@localhost home]# echo string1
string1
[root@localhost home]# echo $string1
hello bash
需要用{}的情况,变量后有其他的值,{}区分开来

[root@localhost home]# echo ${string1}23
hello bash23

[root@localhost home]# a=1
另起一个子shell,修改变量,退出后变量值不变

[root@localhost home]# bash
[root@localhost home]# a=2
[root@localhost home]# exit
exit
[root@localhost home]# echo $a
1

当前进程下修改a 的值,会发生变化

[root@localhost home]# read a
4
[root@localhost home]# echo $a
4

环境变量

环境变量:每个shell打开都可以获得到的变量
查看环境变量env

[root@localhost home]# env|more
XDG_VTNR=1
SSH_AGENT_PID=5264
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
VTE_VERSION=5202
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=gnome-
HISTSIZE=1000
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/7e33d8d5_f254_4c0a_ab83_39583ace9330
IMSETTINGS_MODULE=IBus
USER=tang
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:b
d=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5
;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5
;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*
.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;
5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;
9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5
;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=
38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*
.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38
;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;
13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;1
--More--

  • 查看所有变量:set | more
  • 查看某个变量:echo $变量名

在这里插入图片描述

  • 查看当前命令搜索路径:echo $PATH

在这里插入图片描述
举个例子:
在这里我写了一个shell脚本,输出hello world和文件大小:
在这里插入图片描述
在这里我们用./方法可以打开文件,而直接输入文件名缺不能打开:
在这里插入图片描述
这时,我们将当前路径加入搜索路径即可,并且对当前shell任意位置都生效,对子shell也生效,对另起的shell无效:
在这里插入图片描述

终端命令提示符

查看:echo $PS1
在这里插入图片描述
临时修改:
在这里插入图片描述
永久修改:
在这里插入图片描述
在这里插入图片描述
参考:
\d: 显示曰期,格式为"星期 月 日"。
\H: 显示完整的主机名。如默认主机名"localhost.localdomain"。
\h: 显示简写的主机名。如默认主机名"localhost"。
\t: 显示 24 小时制时间,格式为"HH:MM:SS"。
\T: 显示 12 小时制时间,格式为"HH:MM:SS"。
\A: 显示 24 小时制时间,格式为"HH:MM"。
@:显示 12 小时制时间,格式为"HH:MM am/pm"。
\u: 显示当前用户名。
\v: 显示 Bash 的版本信息。
\w:显示当前所在目录的完整名称。
\W:显示当前所在目录的最后一个目录。
#: 执行的第几条命令。
KaTeX parse error: Expected 'EOF', got '#' at position 28: …ot 用户,则会显示提示符为"#̲";如果是普通用户,则会显示提…"。

预定义变量

  • echo $?

用于确认上一条命令是否执行成功,0是,1否,常用于test判断与if 条件判断

[root@localhost ~]#ifconfig lo
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 566  bytes 65414 (63.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 566  bytes 65414 (63.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]#echo $?
0
[root@localhost ~]#ifconfig em0
em0: error fetching interface information: Device not found
[root@localhost ~]#echo $?
1
  • echo $$

脚本监测,展示当前进程PID

[root@localhost ~]#echo $$
17690
  • echo $0

当前进程名,查看当前运行结果
vim 4.sh

#!/bin/bash

#PID NAME
echo $$
echo $0

[root@localhost ~]#chmod 5 4.sh
[root@localhost ~]#bash 4.sh
21759
4.sh
[root@localhost ~]#. 4.sh
17690
bash

位置变量

为shell脚本带更多参数
vim 6.sh

#!/bin/bash

# $1 $2 $3... #9 ${10}
pos1=$1
pos2=$2
echo $pos1
echo $pos2

[root@localhost ~]#chmod 5 6.sh
[root@localhost ~]#./6.sh -a -l
-a
-l
有时,我们读入的值可能是空值,造成输出错误,我们可以用_来代替空值

#!/bin/bash

# $1 $2 $3... #9 ${10}
pos1=$1
echo $pos1
echo ${pos2}_

[root@localhost ~]#./6.sh -a
-a
_
更好的方法是用变量替换空值:
vim 6.sh

#!/bin/bash

# $1 $2 $3... #9 ${10}
pos1=$1
pos2=${2-_}
echo $pos1
echo $pos2

[root@localhost ~]#./6.sh -a
-a
_
[root@localhost ~]#./6.sh -a -l
-a
-l


## 环境变量配置文件
  • /etc/profile
  • /etc/profile.d/
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
    ~配置用于配置家用户配置
    查看不同用户加载的配置,这里我们先修改一下配置:
    vim /etc/profile
    在这里插入图片描述
    vim /etc/bashrc
    在这里插入图片描述
    vim ~/.bashrc
    在这里插入图片描述
    vim ~/.bash_profile
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里执行顺序就可以看到了,这样做的意义是我们在定义变量的时候防止同名变量的覆盖以及给命令增加新的搜索路径
    export PATH=$PATH:/NewPath

在这里插入图片描述
可以看到直接用su root配置文件是加载不全的
注意:
配置文件新增的环境变量(如在/etc/bashrc中)不能立即生效,可以通过如下方法:

  • source /etc/bashrc
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值