本文是《鸟哥的Linux私房菜》的读书笔记,学习内容来自:《鸟哥的Linux私房菜》,版权归鸟哥。
ps | grep $$ | awk '{print $4}'
。/etc/shells
。/etc/passwd
。type [-tpa] name
echo
,变量在被取用时,前面必须要加上$
才行。举例说明:echo $PATH
或者echo ${PATH}
=
连接即可。举例:myName=wangzz
。=
)两边不能直接接空格,错误实例yourName = Kobe
,这与大多数人编程习惯不同,需要注意。2B=xx
"
或单引号'
将变量内容结合起来,但要注意:
$
等,可以保有原本的特性,如下所示:var="lang is $LANG"
则echo $var
可得lang is en_US
。var='lang is $LANG'
则echo $var
可得lang is $LANG
\
将特殊符号(如 [Enter], $, \, 空格符, ‘等)变成一般字符;`命令`
或 $(命令)
,比如:path=`pwd`
name=Messi
变量增加内容,可以这么做:name="$name"IsMagic
,或者是name=${name}IsMagic
。export PATH
。经尝试,子程序export并不能使变量变成环境变量而在父程序使用。unset
。declare
作用
declare [+/-][rxi][变量名称=设置值] 或 declare -f
+/-
“-“可用来指定变量的属性,”+”则是取消变量所设的属性。但是+a
和+r
无效,无法删除数组和只读属性,可以使用unset
删除数组,但是unset
不能删除只读变量 -a
设置变量为数组array-A
声明关联数组,可以使用字符串作为数组索引-f
如果后面没有参数的话会列出之前脚本定义的所有函数,如果有参数的话列出以参数命名的函数-F
不显示函数定义-i
设置变量为整数-l
大写字母变小写,这儿是L
的小写l
,意思是lowercase。不是大写I
哦。-r
将变量设置为只读,设置为只读后,只有注销再登录才能恢复变量原来类型。-t
设置跟踪属性,用于跟踪函数进行调试,对于变量没有特殊意义-u
变量值的大写字母变为大写-x
指定的变量会成为环境变量,可供shell以外的程序来使用。-p
显示变量定义的方式和值set
指令的效果相同)。set
观察所有变量 (含环境变量与自定义变量)
[root@wangzz shelldemo]$
这个便是。为什么显示这样子,便是由PS1变量决定,当然你可以更改。\d
:可显示出『星期 月 日』的日期格式,如:”Mon Feb 2”\H
:完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』\h
:仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略\t
:显示时间,为 24 小时格式的『HH:MM:SS』\T
:显示时间,为 12 小时格式的『HH:MM:SS』\A
:显示时间,为 24 小时格式的『HH:MM』\@
:显示时间,为 12 小时格式的『am/pm』样式\u
:目前使用者的账号名称,如『root』;\v
:BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示\w
:完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;\W
:利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。\#
:下达的第几个命令。\$
:提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~(没有故意卖萌,原话是鸟哥说的)echo $$
:显示当前shell的PID[root@wangzz shelldemo]$ wangzz
bash: wangzz: command not found
[root@wangzz shelldemo]$ echo $?
127
read
来读取键盘输入的变量。
read [-pt] variable
-p
:后面可以接提示字符-t
:后面可以接等待的时间(秒)ulimit [-SHacdfltu] [配额]
-H
:hard limit ,严格的配置,必定不能超过这个配置的数值;-S
:soft limit ,警告的配置,可以超过这个配置值,但是若超过则有警告信息。
在配置上,通常 soft 会比 hard 小,举例来说,soft 可配置为 80 而 hard
配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,
系统会有警告信息通知你!-a
:后面不接任何选项与参数,可列出所有的限制额度;-c
:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。-f
:此 shell 可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes-d
:程序可使用的最大断裂内存(segment)容量;-l
:可用于锁定 (lock) 的内存量-t
:可使用的最大 CPU 时间 (单位为秒)-u
:单一用户可以使用的最大程序(process)数量。-n
:同时开启的文件数量=
)
#
echo ${path#/*:}
,删除匹配的最短的那个。可以使用*
匹配所有。#
:符合取代文字的『最短的』那一个;##
:符合取代文字的『最长的』那一个%
echo ${path%:*bin}
%
:符合取代文字的『最短的』那一个;%%
:符合取代文字的『最长的』那一个echo {path/bin/BIN}
echo {path//bin/BIN}
new_var=${old_var-content}
:如果变量不存在用content替换,如果存在则使用原来值。username=${username:-root}
:如果变量不存在或者为空字符串,则替换。否则使用原来值。echo ${var?error}
+
与上面4的-
相反=
可以实际地替换变量值。wangzz=${str=newStr}
\d
本地端时间的日期;\l
显示第几个终端机接口;\m
显示硬件的等级 (i386/i486/i586/i686…);\n
显示主机的网络名称;\o
显示 domain name;\r
操作系统的版本 (相当于 uname -r)\t
显示本地端时间的时间;\s
操作系统的名称;\v
操作系统的版本。bash
,回车。.
点也可以使配置立即生效。. ~/.bashrc
。符号 | 内容 | |
---|---|---|
# | 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 | |
\ | 跳脱符号:将『特殊字符或通配符』还原成一般字符 | |
管线 (pipe):分隔两个管线命令的界定(后两节介绍); | ||
; | 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) | |
~ | 用户的家目录 | |
$ | 取用变量前导符:亦即是变量之前需要加的变量取代值 | |
& | 工作控制 (job control):将命令变成背景下工作 | |
! | 逻辑运算意义上的『非』 not 的意思! | |
/ | 目录符号:路径分隔的符号 | |
>, » | 数据流重导向:输出导向,分别是『取代』与『累加』 | |
<, « | 数据流重导向:输入导向 (这两个留待下节介绍) | |
’ ‘ | 单引号,不具有变量置换的功能 | |
” “ | 具有变量置换的功能! | |
` ` | 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) | |
( ) | 在中间为子 shell 的起始与结束 | |
{ } | 在中间为命令区块的组合! |
>
会将内容覆盖>>
不会覆盖,会追加内容/dev/null
用法(控设备,鸟哥称为垃圾桶黑洞装置)2>&1
或者&>
find /home -name .bashrc > list 2>&1
find /home -name .bashrc &> list
<
或<<
将原本需要由键盘输入的数据,改由文件内容来取代
cat > file_name
,之后输入文件内容,完成后Ctrl+d。cat > filename < src_file
<<
又是做什么的额?表示输入的结束字符,可以替代Ctrl+d。cat > catfile << "eof"
命令运行的判断依据: ; , &&, |
cmd ; cmd
(不考虑命令相关性的连续命令下达)就是说两个命令没有关联,只是依次执行两个命令而已。
$? (命令回传值) 与 && 或 ||
cmd1 && cmd2
cmd1 || cmd2
ls -al|less
|
仅能处理经由前面一个命令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力。管道后面必须接一个可以接受标准输入的命令。如: less, more, head, tail
cut
,grep
。截取命令通常是针对一行来分析,并非全文。
cut
-d
:后面接分隔字符。与 -f 一起使用;-f
:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;-c
:以字符 (characters) 的单位取出固定字符区间;last|cut -d ' ' -f 1
,export|head -n 1|cut -c 12-18
grep
解析一行文字,取得关键词,若该行有存在关键词,就会整行列出来!
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a
:将 binary 文件以 text 文件的方式搜寻数据-c
:计算找到 ‘搜寻字符串’ 的次数-i
:忽略大小写的不同,所以大小写视为相同-n
:顺便输出行号-v
:反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!--color=auto
:可以将找到的关键词部分加上颜色的显示喔grep -i 'manpath' /etc/man_db.conf
sort, wc, uniq
sort [-fbMnrtuk] [file or stdin]
依据不同的数据型态来排序
-f
:忽略大小写的差异,例如 A 与 a 视为编码相同;-b
:忽略最前面的空格符部分;-M
:以月份的名字来排序,例如 JAN, DEC 等等的排序方法;-n
:使用『纯数字』进行排序(默认是以文字型态来排序的);-r
:反向排序;-u
:就是 uniq ,相同的数据中,仅出现一行代表;-t
:分隔符,默认是用 [tab] 键来分隔;-k
:以那个区间 (field) 来进行排序的意思cat /etc/passwd | sort -t ':' -k 3
uniq [-ic]
将重复的行删除掉只显示一个
-i
:忽略大小写字符的不同;-c
:进行计数wc [-lwm]
-l
:仅列出行;-w
:仅列出多少字(英文单字);-m
:多少字符;tee [-a] file
tr, col, join, paste, expand
tr - translate or delete characters
替换或者删除字符串。
tr [-ds] SET1 ...
-d
:删除信息当中的 SET1 这个字符串;-s
:取代掉重复的字符!cat passwd |tr -d '\r' > ~/passwd.linux
col - filter reverse line feeds from input
-x
:将 tab 键转换成对等的空格键-b
:在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符例子```cat testChar.c | col -x | cat -A`` |
join - join lines of two files on a common field
join [-ti12] file1 file2
-i
:忽略大小写的差异;-1
:这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;-2
:代表『第二个文件要用那个字段来分析』的意思。paste - merge lines of files
paste [-d] file1 file2
-d
:后面可以接分隔字符。默认是以 [tab] 来分隔的!-
:如果 file 部分写成 - ,表示来自 standard input 的数据的意思cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
expand - convert tabs to spaces
col -x
吗)expand [-t] file
-t
:后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
我们也可以自行定义一个 [tab] 按键代表多少个字符呢!grep '^MANPATH' /etc/man_db.conf |head -n 3|expand -t 1|cat -A
,注意这儿添加多少空格并不是死值。split - split a file into pieces
split [-bl] file PREFIX
-b
:后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等;-l
:以行数来进行分割。ls -al / | split -l 10 - lsroot
,这里注意,如果你忽略了-
,也就是这样输入ls -al|split -l 10 lsroot.
,你会得到这个错误:split: cannot open ‘ls.’ for reading: No such file or directory
。因为这里没有文件,这里的 - 就会被当成 stdin 或 stdout。xargs - build and execute command lines from standard input
xargs [-0epn] command
-0
:如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。这个参数可以用于特殊状态喔!-e
:这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到
这个字符串时,就会停止继续工作!-p
:在运行每个命令的 argument 时,都会询问使用者的意思;-n
:后面接次数,每次 command 命令运行时,要使用几个参数的意思。看范例三。find /sbin -perm +7000 | xargs ls -l
,find ./ -name "*" |xargs -p grep -n "ab"
。-
可以当成 stdin 或 stdout。某些命令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 “-“ 来替代, 举例来说:
[root@www ~]# tar -cvf - /home | tar -xvf -
鸟哥这里用了很大的篇幅介绍正则表达式,这儿大多数编程语言学习时候都会进行学习,所以不做重点学习,大概预览一下。