linux下shell编程基础知识

简介:

1、history    记录历史命令;

预设记录1000条命令,存储在用户家目录 .bash_history 文件中;

!!     执行上一条命令

!n    n为数字,history里面显示的指令数字

!cat    执行最近一次以cat开头的命令

!$    上一条命令的最后一个参数


man builtin    可以查询系统内置的所有命令;


2、指令和文件名补全

Tab键    连续按2次列出所有的指令或文件名;


3、别名alias

自定义别名,把很长的经常使用的命令别名一个简单的命令

1
2
3
4
5
6
7
8
9
10
11
12
[root@yonglinux ~] # alias yong="cat /etc/sysconfig/network-scripts/ifcfg-eth0"
[root@yonglinux ~] # yong
DEVICE=eth0
HWADDR=00:0C:29:43:3D:32
TYPE=Ethernet
UUID=0b1f4512-cefa-4a9e-ae85-adb2ac2a9903
ONBOOT= yes
NM_CONTROLLED= yes
BOOTPROTO=static
IPADDR=192.168.20.20
NETMASK=255.255.255.0
GATEWAY=192.168.20.2

unalias    解除别名

别名永久生效的话,把命令写入到当前用户家目录 .bashrc里面;只对当前用户生效。


4、通配符

*    代表零个或多个任意字符

?    代表1个任意字符


5、输入输出重定向

输出重定向 >

把前面的输出不显示在当前屏幕上,输出到指定文件里面;

追加重定向 >> 把内容追加到文件里面;

输入重定向 <    把后面的文件作为前面命令的输入;

2>        错误重定向(写脚本的时候会用到)

2>>     错误追加重定向

1
2
3
4
5
6
[root@localhost ~] # ls -l /dev/stdin 
lrwxrwxrwx. 1 root root 15 4月   6 11:04  /dev/stdin  ->  /proc/self/fd/0
[root@localhost ~] # ls -l /dev/stdout 
lrwxrwxrwx. 1 root root 15 4月   6 11:04  /dev/stdout  ->  /proc/self/fd/1
[root@localhost ~] # ls -l /dev/stderr 
lrwxrwxrwx. 1 root root 15 4月   6 11:04  /dev/stderr  ->  /proc/self/fd/2

标准输入设备stdin用0表示;键盘;

标准输出设备 stdout用1表示,显示器显示;

标准输出错误 stderr用2表示,显示器显示;


示例:直接ls 会在当前屏幕显示出来,正确和错误的信息;

1
2
3
4
5
6
7
[root@localhost ~] # ls /etc/passwd /etc/passwd1
ls : 无法访问 /etc/passwd1 : 没有那个文件或目录
/etc/passwd
[root@localhost ~] # ls /etc/passwd /etc/passwd1 >1.log 2>&1
[root@localhost ~] # cat 1.log
  ls : 无法访问 /etc/passwd1 : 没有那个文件或目录
  /etc/passwd

正确输出1默认可以不用写,直接重定向到1.log里面,2代表错误输出,重定向到&1代表前面的1.log;有时候也可以>>追加到日志;


1
2
3
4
5
[root@localhost ~] # ls /etc/passwd /etc/passwd1 
&>all.log
[root@localhost ~] # cat all.log 
ls : 无法访问 /etc/passwd1 : 没有那个文件或目录
/etc/passwd

&表示所有,包括正确输出1和错误输出2,输出重定向到all.log里面;


6、管道符 |

把前面命令的输出结果作为后面命令的输入

1
2
[root@yonglinux ~] # cat /etc/passwd | wc -l
25


7、作业控制

当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c)

jobs    可以查看被暂停或在后台运行的任务

1
2
3
4
5
6
7
8
9
10
11
12
[root@yonglinux ~] # vmstat 1 > /tmp/1.log 
^Z
[1]-  Stopped                  vi  file
[2]+  Stopped                 vmstat 1 >  /tmp/1 .log
[root@yonglinux ~] # jobs
[1]-  Stopped                  vi  file
[2]+  Stopped                 vmstat 1 >  /tmp/1 .log
[root@yonglinux ~] # bg 2
[2]+ vmstat 1 >  /tmp/1 .log &
[root@yonglinux ~] # jobs
[1]+  Stopped                  vi  file
[2]-  Running                 vmstat 1 >  /tmp/1 .log &

想要让进程在后台运行的话加 &,中间有空格,进程就在后台运行了。

vmstat 1    用来观察系统状态的一个命令。

fg 2 让后台运行的进程回到当前运行,ctrl+c 可以终止进程。

+号显示的为优先级最高。


另一种情况,关闭当前shell,重新打开另一个shell,使用jobs并不会显示在后台运行的进程。想要停止进程的话,需要知道pid,然后使用kill命令杀死进程。如遇到杀不死的进程,使用 kill -9 pid

1
2
3
4
[root@yonglinux ~] # ps aux | grep vmstat
root      1909  0.0  0.1   2016   548 pts /0     S    15:03   0:00 vmstat 1
root      1941  0.0  0.1   4356   732 pts /0     S+   15:08   0:00  grep  vmstat
[root@yonglinux ~] # kill 1909


8、变量,就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。

通常shell预设的变量名为大写。可以使用echo查看变量;

常用变量有:PATH、HOME、LANG、PWD、LOGNAME、HOSTNAME

1
2
3
4
5
6
7
8
9
10
[root@yonglinux ~] # echo $PATH
/usr/lib/qt-3 .3 /bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin
[root@yonglinux ~] # echo $HOME
/root
[root@yonglinux ~] # echo $PWD
/root
[root@yonglinux ~] # echo $LOGNAME
root
[root@yonglinux ~] # echo $HOSTNAME
yonglinux.com

env   可以查看系统预设的所有环境变量;

set    可以列出系统预设的全部变量,包括用户自己设定的变量;


自定义变量    变量名=变量内容    

自定义变量只在当前shell下生效;bash命令打开一个新的shell,变量就不会生效,退出新shell后,回到当前shell,变量继续生效;

1
2
3
4
5
6
7
8
9
[root@yonglinux ~] # ABC=centos
[root@yonglinux ~] # echo $ABC
centos
[root@yonglinux ~] # bash
[root@yonglinux ~] # echo $ABC
[root@yonglinux ~] # exit
exit
[root@yonglinux ~] # echo $ABC
centos


变量永久生效的方法:

1)系统下所有用户登录都可以使用该变量

在/etc/profile 配置文件中最后一行,添加"export myname=YongLinux",然后执行source /etc/profile 生效;source命令的作用是,将目前设定的配置刷新,即不用注销再登录也能生效。

1
2
3
4
5
[root@yonglinux ~] # echo "export myname=YongLinux" >> /etc/profile
[root@yonglinux ~] # source /etc/profile
[root@yonglinux ~] # su - user1
[user1@yonglinux ~]$  echo  $myname 
YongLinux


2)只在当前用户下使用变量

在用户的家目录下 .bashrc 配置文件,添加"export myname=YongLinux",然后执行source .bashrc 生效;

1
2
3
4
5
[user1@yonglinux ~]$  pwd /home/user1
[user1@yonglinux ~]$  echo  "export myname=YongLinux"  >> .bashrc
[user1@yonglinux ~]$  source  .bashrc
[user1@yonglinux ~]$  echo  $myname
YongLinux


自定义变量的规则

1、设定变量的格式“变量名=变量内容”等号两边不能有空格

2、变量名只能由英文、数字及下划线组成,而且不能以数字开头;

3、当变量内容带有特殊字符(空格 $),需要加单引号;

1
2
3
[root@yonglinux ~] # ABC='linux centos'
[root@yonglinux ~] # echo $ABC
linux centos

如变量内容中本身有单引号,需要加双引号;

1
2
3
[root@yonglinux ~] # ABC="Linux'"
[root@yonglinux ~] # echo $ABC
Linux'

4、如果变量内容需要引用其他运行结果,需要使用反引号

1
2
3
[root@yonglinux ~] # ABC=`pwd`
[root@yonglinux ~] # echo $ABC
/root

5、变量内容可以累加其他变量的内容,需要加双引号。

1
2
3
4
5
6
[root@yonglinux ~] # AA="Angle"
[root@yonglinux ~] # echo $AA
Angle
[root@yonglinux ~] # AB="$AA"BB
[root@yonglinux ~] # echo $AB
AngleBB


单引号和双引号的区别,用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用。


9、pstree    以树状图显示当前系统的进程

当前shell下运行bash命令后,会进入一个新的shell,新shell为之前shell的子shell;

1
2
3
4
5
6
7
[root@yonglinux ~] # pstree | grep bash
      |-login--- bash
      |-sshd---sshd--- bash -+- grep
[root@yonglinux ~] # bash
[root@yonglinux ~] # pstree | grep bash
      |-login--- bash
      |-sshd---sshd--- bash --- bash -+- grep


在父shell中设定一个变量后,进入子shell后变量不会生效;需要在子shell中生效要用exprot指令export 声明全局变量,让该shell的子shell也知道;如果export后面不加任何变量名,则它会声明所有的变量。

1
2
3
4
5
6
7
8
9
10
[root@yonglinux ~] # echo $AA
Angle
[root@yonglinux ~] # bash
[root@yonglinux ~] # echo $AA
[root@yonglinux ~] # exit
exit
[root@yonglinux ~] # export AA
[root@yonglinux ~] # bash
[root@yonglinux ~] # echo $AA
Angle


10、取消变量    unset 变量名

1
2
3
4
5
[root@yonglinux ~] # AB="Angle BB"
[root@yonglinux ~] # echo $AB
Angle BB
[root@yonglinux ~] # unset AB
[root@yonglinux ~] # echo $AB


系统环境变量与个人环境变量的配置文件

/etc/profile   系统预设的几个重要的变量,例如PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

/etc/bashrc    预设umask以及PS1等变量。PS1就是我们登录linux 命令行最前面显示的字符;

\u   用户users

\h   主机名hostname

\W   当前目录pwd

\$   系统用户为#,普通用户显示$


1
2
3
[root@yonglinux ~] # echo $PS1[\u@\h \W]\$
[root@localhost ~] # PS1='[\h@\u \W]\$'
[localhost@root ~] #

更改PS1的显示;


每个用户的主目录下还有几个这样的隐藏文件:

.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。

.bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。

.bash_history :记录命令历史用的。

.bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。


Linux shell中的特殊字符

*    代表零个或多个任意字符

?    代表一个任意字符

#    代表注释说明的意思,#号后面的内容忽略掉;

\    脱意字符,将后面的特殊字符(* $)还原为普通字符;

|    管道符,讲前面命令执行的结果作为后面命令的输入;

$    引用变量

;    分隔2个命令,2个命令都执行,不管前面命令是否错误 ls a.txt ; cat a.txt 

&    把命令放到后台运行

&&    命令的连接符,第一个执行成功才会执行第二个;

||    分隔命令,只有前面命令运行不成功,才会执行后面的命令;


cut    截取某一个字段、字符

-d    指定分隔符,分割字符用单引号 ' ' 括起来

-f    指定第哪个区间

-c    指定第几个字符;指定多个字符 -c 1,5 ;可以指定一个区间 -c 1-4 ;


列出以:号分隔列出第7列的内容,只显示前3行;

1
2
3
4
5
6
7
8
[root@localhost ~] # cut -d: -f 7 passwd | head -3 
/bin/bash
/sbin/nologin
/sbin/nologin
[root@yonglinux ~] # head -3 passwd |cut -c 1-4
root
bin:
daem


sort    排序输出    默认按首字母升序的顺序排列;

-t    指定分隔符

-k    指定以哪个区间进行排序

-r    逆序排列

-u    删除重复的

-n    按照数字大小排序

-f    忽略大小写

按:号分隔,按第3列uid排序;

1
2
3
4
[root@localhost ~] # sort -t: -n -k 3 passwd |head -3
root:x:0:0:root: /root : /bin/bash
ROOT:x:1:1:bin: /bin : /sbin/nologin
daemon:x:2:2:daemon: /sbin : /sbin/nologin


wc    统计行数、单词数、字节数

wc -l      统计行数

wc -w    统计单词数

wc -c     统计字符数(wc -m 一样的功能)

1
2
3
4
5
6
7
8
[root@yonglinux ~] # wc -l /etc/passwd
24  /etc/passwd
[root@yonglinux ~] # wc -w /etc/passwd
32  /etc/passwd
[root@yonglinux ~] # wc -c /etc/passwd
1041  /etc/passwd
[root@yonglinux ~] # wc /etc/passwd
   24   32 1041  /etc/passwd


uniq    去除重复的行

针对数字的话,需要先进行sort排序,再去除重复的行。

-c    统计重复的行数,并写在最前面;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@yonglinux tmp] # uniq 1.txt 
111
222
111
333
[root@yonglinux tmp] # sort 1.txt | uniq -c
       2 111
       1 222
       1 333
[root@yonglinux tmp] # sort test.txt |uniq -c
       2 12345      
       1 67899      
       2 abc      
       1 helloworld


tee    重定向文件,并且同时还在屏幕上显示;

类似与重定向 “>”, 但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。

1
2
[root@yonglinux ~] # echo 'abcdefg' | tee test.txt
abcdefg


tr    替换字符

常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号;

-d    删除某个字符


把小写字母变成大写字母

1
2
3
[root@yonglinux ~] # head -2 passwd | tr '[a-z]' '[A-Z]'
ROOT:X:0:0:ROOT: /ROOT : /BIN/BASH
BIN:X:1:1:BIN: /BIN : /SBIN/NOLOGIN

替换一个字符

1
2
3
[root@yonglinux ~] # head -2 passwd | tr 'r' 'R'
Root:x:0:0:Root: /Root : /bin/bash
bin:x:1:1:bin: /bin : /sbin/nologin


 split    切割文档

-b    依据大小来分割文档,单位为byte

-l    依据行数来分割文档。


示例一,按b大小分割

1
2
3
4
5
6
7
[root@yonglinux ~] # ls -lb passwd
  -rw-r--r--. 1 root root 1076 Apr  9 15:14  passwd
[root@yonglinux ~] # split -b 500 passwd
[root@yonglinux ~] # ls -l
-rw-r--r--. 1 root root  500 Apr  9 15:17 xaa
-rw-r--r--. 1 root root  500 Apr  9 15:17 xab
-rw-r--r--. 1 root root   76 Apr  9 15:17 xac

示例二,按l行数分割

1
2
3
4
5
6
7
8
[root@yonglinux ~] # cat passwd |wc -l
24
[root@yonglinux ~] # split -l 8 passwd 
[root@yonglinux ~] # wc -l xa*
    8 xaa   
    8 xab   
    8 xac  
    24 total






本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1630600,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
|
3月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
577 1
|
7月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
310 13
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
202 4
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
412 3
|
8月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
645 25
|
8月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
178 18
|
10月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
743 32