前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本学习之必须了解的基础命令

shell脚本学习之必须了解的基础命令

作者头像
汤高
发布2018-01-11 16:06:21
8360
发布2018-01-11 16:06:21
举报
文章被收录于专栏:积累沉淀积累沉淀

命令历史

history

!! 表示执行上一条命令

!n  表示执行历史中第n条命令

!字符串  表示执行命令历史中首次出现该字符串的命令

设置别名:alias

取消别名:unalias

通配符

在bash下  

* :匹配0个或多个字符

?:只匹配一个字符

输入重定向:<

输出重定向:>

追加重定向:>>

错误重定向: 2>

错误追加重定向:2>>

管道符:|

作业控制

job:查看任务

Ctrl+z:暂停任务

fg:恢复暂停的任务

bg:把暂停的任务丢到后台运行

查看进程

ps aux |grep 任务

杀死进程

kill命令语法很简单,直接在后面加pid即可,如果遇到杀不死的进程时,可以在kill 后面加一个选项: 

kill -9 [pid]

变量

echo显示变量的值

echo  $PATH

env:

使用 env 命令即可全部列出系统预设的全部系统变量,不过登录的用户不一样这些环境变量的值也不一样

PATH 决定了shell将到哪些目录中寻找命令或程序 

HOME 当前用户主目录

 HISTSIZE 历史记录数 

LOGNAME 当前用户的登录名 

HOSTNAME 指主机的名称 

SHELL 前用户Shell类型

LANG 语言相关的环境变量,多语言可以修改此环境变量 

MAIL 当前用户的邮件存放目录 PWD 当前目录

set:

env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部

变量都显示出来

set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。

1) 要想系统内所有用户登录后都能使用该变量

需要在 “/etc/profile” 文件最末行加入 export myname=Aming 然后运行 source /etc/profile 就可以生效了。此时再运行bash命令或者直接 su - test 账户可以看到效果。

2)只想让当前用户使用该变量

需要在用户主目录下的 .bashrc 文件最后一行加入 export myname=Aming 然后运行 source .bashrc 就可以生效了。这时候再登录test账户,myname变量则不会生效了。source命令的作用是,将目前

设定的配置刷新,即不用注销再登录也能生效。

引用其他命令的执行结果 用反单引号:

[root@localhost ~]# myname=`pwd`

[root@localhost ~]# echo $myname

/root

pstree:

 这个指令会把linux系统中所有进程通过树形结构打印出来

pstree |grep bash

export:

使变量在其他字shell中生效

unset:取消变量

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

/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, 

HISTSIZE, umask等等。

/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如

[root@localhost ~]#, 我们不妨看一下PS1的值:

[root@localhost ~]# echo $PS1

[\u@\h \W]\$

\u 就是用户, \h 主机名, \W 则是当前目录,\$ 就是那个 ‘#’ 了,如果是普通用户则显示为 ‘$’.

除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:

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

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

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

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

linux shell中的特殊符号

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

? 只代表一个任意的字符 

# 这个符号在linux中表示注释说明的意思,即 # 后面的内容linux忽略掉。 

\ 脱意字符,将后面的特殊符号(例如”*” )还原为普通字符。 

| 管道符,前面多次出现过,它的作用在于将符号前面命令的结果丢给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,

cut命令

用来截取某一个字段

语法: cut -d '分隔字符' [-cf] n 这里的n是数字

-d :后面跟分隔字符,分隔字符要用单引号括起来

-c :后面接的是第几个字符

-f :后面接的是第几个区块

命令 : sort

sort 用做排序

语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2

-t 分隔符 :作用跟cut的-d一个意思

-n :使用纯数字排序

-r :反向排序

-u :去重复

-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序

命令 : wc

用于统计文档的行数、字符数、词数,常用的选项为:

-l :统计行数

-m :统计字符数

-w :统计词数

wc 不跟任何选项,直接跟文档,则会把行数、词数、字符数依次输出

命令 : uniq

去重复的行

-c :统计重复的行数,并把行数写在前面

[root@localhost ~]# vim testb.txt

把下面的内容写入testb.txt, 保存。

111

222

111

333

使用uniq 的前提是需要先给文件排序,否则不管用。

[root@localhost ~]# uniq testb.txt

111

222

111

333

[root@localhost ~]# sort testb.txt |uniq

111

222

333

[root@localhost ~]# sort testb.txt |uniq -c

      2 111

      1 222

      1 333

命令 : tee

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

[root@localhost ~]# echo "aaaaaaaaaaaaaaaaaaaaaaaaaaa" |tee testb.txt

aaaaaaaaaaaaaaaaaaaaaaaaaaa

[root@localhost ~]# cat testb.txt

aaaaaaaaaaaaaaaaaaaaaaaaaaa

tee 常用语管道符 “|” 后。

命令 : tr

替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号。常用的选项有两个:

-d :删除某个字符,-d 后面跟要删除的字符

-s :把重复的字符去掉

最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’

[root@localhost ~]# head -n2 /etc/passwd |tr '[a-z]' '[A-Z]'

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

当然替换一个字符也是可以的。

[root@localhost ~]# grep 'root' /etc/passwd |tr 'r' 'R'

Root:x:0:0:Root:/Root:/bin/bash

opeRatoR:x:11:0:opeRatoR:/Root:/sbin/nologin

命令 : split

切割文档,常用选项:

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

[root@localhost ~]# mkdir split_dir

[root@localhost ~]# cd !$

cd split_dir

[root@localhost split_dir]# cp /etc/passwd ./

[root@localhost split_dir]# split -b500 passwd

[root@localhost split_dir]# ls

passwd  xaa  xab  xac

如果split不指定目标文件名,则会以xaa xab... 这样的文件名来存取切割后的文件。当然我们也可以指定目标文件名:

[root@localhost split_dir]# split  -b500 passwd  123

[root@localhost split_dir]# ls

123aa  123ab  123ac  passwd

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

[root@localhost split_dir]# rm -f 123a*

[root@localhost split_dir]# split -l10 passwd

[root@localhost split_dir]# wc -l *

  27 passwd

  10 xaa

  10 xab

  7 xac

  54 总用量

$ 除了用于变量前面的标识符外,还有一个妙用,就是和 ‘!’ 结合起来使用。 

[root@localhost ~]# ls testb.txt

testb.txt

[root@localhost ~]# ls !$

ls testb.txt

testb.txt

‘!$’ 表示上条命中中最后一个变量(总之就是上条命令中最后出现的那个东西)例如上边命令最后是testb.txt那么在当前命令下输入!$则代表testb.txt.

; : 分号。平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个 ”;” 了。 

[root@localhost ~]# ls -d test*;  touch test111; ls -d test*

test  test1  test2  test3  testa  testb.txt

test  test1  test111  test2  test3  testa  testb.txt

~ : 用户的家目录,如果是root则是 /root ,普通用户则是 /home/username 

[root@localhost ~]# cd ~

[root@localhost ~]# pwd

/root

[root@localhost ~]# su test

[test@localhost root]$ cd ~

[test@localhost ~]$ pwd

/home/test

& : 如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。 

[root@localhost ~]# sleep 30 &

[1] 3260

[root@localhost ~]# jobs

[1]+  Running                 sleep 30 &

>, >>, 2>, 2>> 前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>> 

[root@localhost ~]# ls aaaa

ls: 无法访问aaaa: 没有那个文件或目录

[1]+  Done                    sleep 30

[root@localhost ~]# ls aaaa

ls: 无法访问aaaa: 没有那个文件或目录

[root@localhost ~]# ls aaaa 2> /tmp/error

[root@localhost ~]# cat /tmp/error

ls: 无法访问aaaa: 没有那个文件或目录

[root@localhost ~]# ls aaaa 2>> /tmp/error

[root@localhost ~]# cat /tmp/error

ls: 无法访问aaaa: 没有那个文件或目录

ls: 无法访问aaaa: 没有那个文件或目录

[ ] 中括号,中间为字符组合,代表中间字符中的任意一个。 

[root@localhost ~]# ls -d test*

test  test1  test111  test2  test3  testa  testb.txt

[root@localhost ~]# ls -d test[1-3]

test1  test2  test3

[root@localhost ~]# ls -d test[1a3]

test1  test3  testa

[root@localhost ~]# ls -d test[0-9]

test1  test2  test3

[root@localhost ~]# ls -d test[0-9a-z]

test1  test2  test3  testa

&& 与 || 

在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&” 和 “||” 

command1 ; command2 

command1 && command2 

command1 || command2 

使用 ”;” 时,不管command1是否执行成功都会执行command2;

使用 “&&” 时,只有command1执行成功后,command2才会执行,否则command2不执行;

使用 “||” 时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档