本文是《鸟哥的Linux私房菜》的读书笔记,学习内容来自:《鸟哥的Linux私房菜》,版权归鸟哥。
ps | grep $$ | awk '{print $4}'。/etc/shells。/etc/passwd。type [-tpa] nameecho,变量在被取用时,前面必须要加上$才行。举例说明: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]$ wangzzbash: wangzz: command not found[root@wangzz shelldemo]$ echo $?127read来读取键盘输入的变量。
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>&1find /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-18grep解析一行文字,取得关键词,若该行有存在关键词,就会整行列出来!
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a :将 binary 文件以 text 文件的方式搜寻数据-c :计算找到 ‘搜寻字符串’ 的次数-i :忽略大小写的不同,所以大小写视为相同-n :顺便输出行号-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!--color=auto :可以将找到的关键词部分加上颜色的显示喔grep -i 'manpath' /etc/man_db.confsort, 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 3uniq [-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.linuxcol - 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 3expand - 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 piecessplit [-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 inputxargs [-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 -鸟哥这里用了很大的篇幅介绍正则表达式,这儿大多数编程语言学习时候都会进行学习,所以不做重点学习,大概预览一下。