鸟哥的私房菜-bash

最近在看鸟哥的私房菜,做了一些笔记,记录下来,能记住最好,记不住以后来查看。

查看命令类型

比如看ls命令:

1
type -a ls

这样可以看到ls的别名(alias)和命令所在的目录。

变量的赋值与应用

1
var="lang is $LANG"

等号两边不能有空格,双引号里可以有变量,这样变量var等于”lang is $LANG”。双引号里的$LANG也是一个变量,它是系统的环境变量,显示的是系统的语言,记住变量前有个$

1
echo $var	#lang is zh_CN.UTF-8

如果变量在单引号里,则直接输出。比如:

1
2
var='lang is $LANG'  
echo $var #lang is $LANG

echo相当于C语言里的printf函数,释放变量用:

1
unset var

1
2
3
4
name=uruir	#不带双引号给变量赋值是可以的,但建议用双引  
echo $name #uruir
name="$name\' book" #这里的\是转义的意思,表示后面的"'"和" "按原样输出
echo $name #uruir' book

将当前变量变成环境变量

1
export var

这样就可以在子bash里使用var变量了,要不然在当前bash消失后,var变量也消失了~

使用echo $PATH查看当前环境变量

添加环境变量

1
PATH="$PATH":/home/ur/bin

目前我知道的添加环境变量是让我们给新安装的程序加上路径,这样就可以直接在bash里输入程序名来执行程序了。当然一般程序的默认安装路径在/bin or /usr/bin or /usr/local/bin这些系统默认的环境变量中~

系统内核

1
2
cd /lib/modules/`uname -r`/kernel  
cd /lib/modules/$(uname -r)/kernel

这里uname -r是一个命令,它显示当前系统内核版本,”`“是“Esc”键,用在路径中表示执行`xxx`这个命令,因为在我ubuntu12.04系统里:uname -r显示的是”3.8.0-35-generic”。而cd是change directory的意思,所以上面的命令表示我要切换到/lib/modules/3.8.0-35-generic/kernel这个目录

查看当前目录

1
echo "the dir is $(pwd)"

如上所示”$(xxx)”跟xxx的功能类似,都是执行xxx命令的意思

取1-32767之间的随机数

1
echo $RANDOM

从键盘读入数据

1
read -p "please keyin ur name:" -t 30 name

这里的-p是read命令的参数,表示在输入时,显示please keyin ur name:这么一个提示语,-t 30也是read的参数,表示在30秒内输入有效,将输入的变量保存到name中,然后只要echo $name就可以显示出刚才输入的变量了~

声明变量类型

1
2
3
4
5
6
declare -i sum=100+210	#i是int类型,所以sum就可以是100和210这两个整型的和了~  
declare -a #array
declare -x sum #环境变量,这样sum就可以在子bash中使用
declare -r 只读 #readable
export | grep sum #grep是查找的意思,与find命令类似
declare +r 取消只读 #使用“+”表示取消

数组

1
2
var[1]="uruir"  
echo "${var[1]}"

对用户的限制

1
ulimit -a

这条命令是查看给用户分配的资源,如果用户很多,那就有必要限制一下用户的资源了,比如我要让一个用户最多只能打开100个文件,则:

1
ulimit -n 100

控制台指令:

1
stty -a

按ctrl+alt+f8是正常的图形界面,f1-f6是类似DOS这样的控制台~

显示文件

1
2
ll -d /etc/?????  
ll -d /etc/*[0-9]*

这里用到了正则表达式,?匹配一个字符,5个?就匹配5个字符,一个不多一个不少。*匹配零到多个字符,[0-9]匹配任意一个数字。一个命令是否支持正则表达式,正则表达式的写法会有所不同,ls系列命令是不支持正则表达式的,这里只是在ls命令的参数中使用了正则

重定向

1
find / -name .bashrc > right 2> wrong

表示在/目录下面查看名为.bashrc的文件,并把正确结果输出到right文件中,错误结果输出到wrong文件中。如果直接find / -name .bashrc,很显然不管正确还是错误的结果,都直接在bash里显示,如果不用less or more命令,那这结果我们就很难看清楚。

1
find / -name .bashrc 2> /dev/null

只得到正确的数据。>前面的2表示错误输出,我们通过2>把错误输出重定向到了/dev/null里面了~相当于把错误结果给扔了,不要了~

1
find / -name .bashrc > list 2>&1	#把正确和错误的结果都重定向到list文件中

文本文件

1
2
cat > list.bak < list	#用list文件中的内容创建一个新的list.bak文件  
cat >> list << "eof" #以eof来结束输入。>>和>一样都是重定向,只是>是直接覆盖原文件,而>>是追加内容。eof是当在一行中输入eof后,文件追加完毕~

分隔符

1
echo $PATH | cut -d ':' -f 3,5

|是管道,它表示把前一条命令的结果传递给后面一条命令。因为PATH变量里各元素以“:”分隔,所以cut命令就从echo拿到数据,并显示出PATH变量中由“:”分隔的第3个和第5个元素,“3,5”改成“3-5”的话,是显示3,4,5三个元素

1
2
export | cut -c 12-  
last | grep 'reboot'

反向选择

1
2
last | grep -v 'reboot'	#-v参数是反向的意思,所以就是在last命令的结果里面找出不含“reboot”的行咯~
last | grep -v 'reboot' | cut -d ' ' -f 1 #这里表示在上面那条命令的结果里使用cut命令,表示只显示出第一列的数据~

排序

1
2
cat /etc/passwd | sort	#对passwd文件的内容进行排序咯,当然排序有各种方式,就要用到下面这条命令里的参数咯~  
cat /etc/passwd | sort -t ':' -k 3 -n

计算行列及总字符数

1
cat /etc/passwd | wc	#wc命令是统计passwd里文本的行,列和总字符数~~~

双向重导向

1
last | tee -a last | cut -d ' ' -f 1	#a是append,不用a则替换