一.变量的显示与设置
1.显示变量:echo $变量名 or echo ${变量}
2.用“=”给变量赋值
①“=”两边不能有空格;
②变量名称只能是英文和数字,但是不能以数字开头;
③变量内容用双引号括起,若内容含有特殊字符(如$),则保持原本的特性;
如:var="lang is $LANG",则echo $var可得 lang is en_US
④变量内容用单引号括起,若内容含有特殊字符(如$),则为一般字符;
如:var='lang is $LANG',则echo $var可得 lang is$LANG
⑤可用转义字符“\”将特殊符号变为一般字符;
如:var=lang\is\ \$LANG,则echo $var也可得 lang is $LANG
⑥在一串命令中,若要通过其他命令提供的信息,可用“`命令`”或“$(命令)”;
如:version=$(uname -r),则echo $version可得2.6.18-128.el5
⑦若该变量为增加变量内容,可用'“$变量名称”+要加的内容 ' or“${变量名称}+要加的内容”;
如:b1=abc
b1="$b1"de
echo $b1 ----->abcde
b1=${b1}fg
echo $b1 ------>abcdefg
⑧若该变量需要在其他子进程执行,可用export来使变量变成环境变量;
⑨通常用大写字符表示系统默认变量,小写字符表示自定义变量;
⑩取消变量:unset 变量名称;
3.查看环境变量:env
4.查看所有变量(包括环境变量和自定义变量):set
查看的所有变量中,其中有一个是PS1(提示符的设置):
\d:显示“星期月日”的格式;
\H:完整的主机名;
\h:仅取主机名在第一个小数点之前的名字;
\t:显示24小时格式的时间“HH : MM : SS”;
\T:显示12小时格式的时间“HH : MM : SS”;
\A:显示24小时格式的时间“HH : MM”;
\@:显示12小时格式的“am/pm”时间样式;
\u:目前用户的账号名称;
\v:BASH的版本信息;
\w:完整的工作目录;
\W:利用bashname函数取得工作木名称,所以仅会列出最后一个目录名;
\#:执行的第几个命令;
\$:用户提示符;
如:[yonghu@CentOS learn]$PS1='[\u@\h \W]\$ \# \v '
[yonghu@CentOS learn]$ 116 4.1
$:关于本shell的PID;
?:关于上个执行命令的回传码;
5.显示结果的语系变量:locale
6.读取来自键盘输入的变量:read [-pt] 变量名
-p:后接提示语;
-t:后接需等待的秒数,过时不候;
如:[yonghu@CentOS learn]$read -p "Input..." -t 22 test1
Input...tushushi
7.声明变量类型:declare/typeset [-aixr] 变量名
-a:将变量名定义为数组类型;
-i:将变量名定义为数字类型;
-x:将变量名定义为环境变量;
-r:将变量设置为readonly类型;
如:[yonghu@CentOS learn]$sum=1+2+3
[yonghu@CentOS learn]$echo $sum
1+2+3
[yonghu@CentOS learn]$typeset -i sum
[yonghu@CentOS learn]$sum=1+2+3
[yonghu@CentOS learn]$echo $sum
6
注:变量类型默认为“字符串”;
bash环境中的数值运算,默认最多仅能达到整数类型;
8.限制文件系统及程序:ulimit [-SHacdfltu] [配额]
-H:hard limit;
-S:soft limit;
-a:后不会接任何参数,可列出所有的限制额度;
-c:限制内核文件(core file);
-d:进程可使用的最大断裂内存(segment)容量;
-f:此shell可创建的最大文件容量,单位为KB;
-l:可用于锁定(lock)的内存量;
-t:可使用的最大CPU时间,单位为秒;
-u:单一用户可使用的最大进程(process)数量;
如:列出你目前身份的所有限制数据数值:
[yonghu@CentOS learn]$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15018
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
---------------------------------------------------------------------------------------
如:限制用户仅能创建10MB以下的文件:
[yonghu@CentOS learn]$ulimit -f 10240
[yonghu@CentOS learn]$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) 10240
9.变量内容的删除与替代:
(1)变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除:${变量#关键字};
(2)变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除:${变量##关键字};
(3)变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除:${变量%关键字};
(4)变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除:${变量%%关键字};
(5)变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换:${变量/旧字符串/新字符串};
(6)变量内容符合“旧字符串”,则所有旧字符串会被新字符串替换:${变量//旧字符串/新字符串};
如:[yonghu@CentOS learn]$path=${PATH}
[yonghu@CentOS learn]$echo $path
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin
[yonghu@CentOS learn]$echo ${path#/*bin}
:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin
[yonghu@CentOS learn]$echo ${path##/*bin:}
/home/yonghubin
[yonghu@CentOS learn]$echo ${path%:*bin}
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
[yonghu@CentOS learn]$ echo ${path%%:*/bin}
/usr/lib/qt-3.3/bin
[yonghu@CentOS learn]$ echo ${path/bin/BIn}
/usr/lib/qt-3.3/BIn:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin
[yonghu@CentOS learn]$echo ${path//bin/BIn}
/usr/lib/qt-3.3/BIn:/usr/local/BIn:/usr/BIn:/BIn:/usr/local/sBIn:/usr/sBIn:/sBIn:/home/yonghu/BIn
注:必须从第一个开始匹配;
10.变量内容的替换:
变量设置方式 | str没有设置 | str为空字符串 | str已设置为非空字符串 |
---|---|---|---|
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} |
str=expr
var=expr
|
str不变
var=
|
str不变
var=$str
|
var=${str:=expr} |
str=expr
var=expr
|
str=expr
var=expr
|
str不变
var=$str
|
var=${str?expr} | expr输出至stderr | var= | var=str |
var=${str:?expr} | expr输出至stderr | expr输出至stderr | var=str |
二.命令别名与历史命令
1.设置别名:alias
如:alias ll = 'ls -l'
去掉别名:unalias 别名
如:unalias ll
注:查看别名内容,只要直接输入“alias”即可
2.历史命令:history [n]
history [-racw]
n:数字,列出最近的n条命令行;
-r:将historyfiles的内容督导目前这个shell的history记忆中;
-a:将目前新增的history命令ixnzengruhistfiles中,若没加histfiles,则默认写入~/.bash_history;
-c:将目前的shell中的所有history内容清除;
-w:将目前的history记忆内容写入histfiles中;
执行第number条命令:!number
由最近的命令向前搜寻并执行命令串开通为command的那条命令:!command
执行上一个命令:!!/向上键
三.Bash的操作环境
1.Bash的登录信息:/etc/issue
\d:本地端时间的日期;
\l:显示第几个终端机接口;
\m:显示硬件的等级(i386/i486/i586/i6866...);
\n:显示主机的网络名称;
\o:显示domain name;
\r:操作系统的版本(相当于uname -r);
\t:显示本地端时间的时间;
\s:操作系统的名称;
\v:操作系统的版本;
如:要显示CentOS release 5.3(Final) (terminal:tty3)
Date:2015-01-01 15:10
Kernel 2.6.18-128.e15 on an i686
Welcome!
可以如下修改/etc/issue:
CentOS release5.3(Final)(terminal:\l)
Date:\d \t
Kernel \r on an \m
Welcome!
2.远程登录程序的界面登录信息:/etc/issue.net
3.用户登录后的信息:/etc/motd
4.终端机的输入按键查阅:stty [-a]
-a:将目前所有的stty参数列出来;
如:[root@www ~]# stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\;erase = ^?; kill = ^U; eof = ^D...(以下省略)
特殊字体的代表含义:
eof:End of file,代表结束输入;(Ctrl+D)
erase:向后删除字符;(Ctrl+?)
intr:送出一个interrupt(中断)信号给目前正在运行的程序;(Ctrl+C)
kill:删除在目前命令行上的所有文字;(Ctrl+U)
quit:送出一个quit的信号给目前正在运行的程序;(Ctrl+\)
start:在某个进程停止后,重新启动它的输出;(Ctrl+Q)
stop:停止目前屏幕的输出;(Ctrl+S)
susp:送出一个terminal stop的信号给正在运行的进程;(Ctrl+Z)
注:^表示[Ctrl]按键的意思;
如:若要用[ctrl]+h进行字符的删除,可以执行:
stty erase ^h
5.设置bash自己的终端机:set [-uvCHhmBx]
-u:默认不启动,若启用后,当使用未设置变量时,会显示错误信息;
-v:默认不启用,若启用后,在讯息被输出前,会先显示信息的原始内容;
-x:默认不启用,若启用后,在命令被执行前,会显示命令内容(前面有++符合);
-h/H:默认启用,与历史命令有关;
-m:默认启用,与工作管理有关;
-B:默认启用,与方括号[]的作用有关;
-C:默认不启用,使用>等时,若文件存在,该文件不会被覆盖;
如:显示目前所有的set设置值:
[yonghu@CentOS learn]$echo $-
himuBH
6.通配符
符 号 | 意 义 |
* | 代表0到无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 代表一定有一个在中括号内的字符。如[abcd]代表一定有一个字符,可能是a,b,c,d中的任何一个 |
[-] | 代表编码顺序内的所有字符。如[0-9]代表0到9之间的所有数字 |
[^] | 表示原向选泽,如[^abc]代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思 |
7.特殊符号
符 号 | 内 容 |
# | 批注符号,常被用在script中,视为说明,其后的数据均不执行 |
\ | 转义符号,将“特殊字符或通配符”还原成一般字符 |
| | 管道,分隔IanGG额管道命令的界定 |
; | 连续命令执行分隔符,连续性命令的界定 |
~ | 用户的主文件夹 |
$ | 使用变量前导符,即是变量前需要加的变量替代值 |
& | 作业控制,将命令变成背景下工作 |
! | 逻辑运算意义上的“非”的意思 |
/ | 目录符号,路径分隔的符号 |
>,>> | 数据流重定向,输出导向,分别是“替换”与“累加” |
<,<< | 数据流重定向,输入导向 |
' ' | 单引号,不具有变量置换的功能 |
" " | 双引号,具有变量置换的功能 |
` ` | 两个“`”之间为先执行的命令,也可使用$() |
( ) | 在中间为子shell的起始与结束 |
{ } | 在中间为命令块的组合 |
8.标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>;
如:查看你的系统根目录下个目录的文件名、权限等信息,并记录下来:
[yonghu@CentOS learn]$ ll / > ~/rootfile <==屏幕并无任何信息
[yonghu@CentOS learn]$ ll ~/rootfile <==有个新文件被创建
-rw-rw-r--. 1 yonghu yonghu 1091 2月 1 16:21 /home/yonghu/rootfile
(1)1>:以覆盖的方法将正确的数据输出到指定的文件或设备上;
(2)1>>:以累加的方法将正确的数据输出到指定的文件或设备上;
(3)2>:以覆盖的方法将错误的数据输出到指定的文件或设备上;
(4)2>>:以累加的方法将错误的数据输出到指定的文件或设备上;
注:“1>>”以及“2>>”中间是没空格的;
(5)要将错误信息忽略掉而不显示或存储:可以输出定向到/dev/null;
(6)将正确和错误的数据通通写入同一个文件:2>&1 or&>;
如:find /home -name .bashrc > list2>&1
find /home -name .bashrc&> list
9.标准输入(stdin):代码为0,使用<或<<
如:用cat命令创建一个文件的简单流程:
[yonghu@CentOS learn]$cat > catfile
testing
cat file test
<==这里按下[ctrl]+d来离开
[yonghu@CentOS learn]$cat catfile
testing
cat file test
如:用stdin替代键盘的输入以创建新文件的简单流程:
[yonghu@CentOS learn]$ cat > catfile< ~/.bashrc
[yonghu@CentOS learn]$ llcatfile ~/.bashrc
-rw-rw-r--. 1 yonghu yonghu 124 2月 1 16:47 catfile
-rw-r--r--. 1 yonghu yonghu 124 7月 18 2013 /home/yonghu/.bashrc
如:用cat直接将输入的信息输出到catfile中,且当由键盘输入eof时,结束输入:
[yonghu@CentOS learn]$cat > catfile<< "eof"
> This is a test.
> OK now stop
> eof
[yonghu@CentOS learn]$cat catfile
This is a test.
OK now stop
10.命令执行的判断依据
(1)cmd ; cmd(不考虑相关性的连续命令执行);
分号前的命令执行完后就会立刻接着执行后面的命令;
(2)
命令执行情况 | 说 明 |
cmd1 && cmd2 | 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2 若cmd1执行完毕且为错误($?≠0),则cmd2不执行 |
cmd1 || cmd2 | 若cmd1执行完毕且正确执行($?=0),则cmd2不执行 若cmd1执行完毕且为错误($?≠0),则开始执行cmd2 |
注:由于命令是一个接着一个去执行,因此如果真要使用判断,&&与||的顺序就不能搞错;
11.管道命令
(1)管道命令仅会处理standard output,对于standard error output会予以忽略;
(2)管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行,如:less,more,head,tail等都是可以接收standard input的管道命令,而像ls,cp,mv等就不是管道命令,因为他们不会接收来自stdin的数据;
(3)选取以“行”为单位的信息,将同一行的数据进行分解:cut -d '分隔字符' -f fields<==用于分隔字符
cut -c 字符范围 <==用于排列整齐的信息
-d:后接分隔字符,与-f 一起使用;
-f:依据-d的分隔字符将一段信息切割为数段,用-f取出第几段的意思;
-c:以字符单位取出固定字符区间;
如:将PATH变量取出,找出第五个路径:
[yonghu@CentOS learn]$ echo $PATH | cut -d ':' -f 5
/usr/local/sbin
如:将export输出的信息取得第12-20字符以后的所有字符串:
export | cut -c 12-20
(4)分析一行的信息,若有所需要的信息,则选取改行:grep [-acinv] [--color=auto] '查找字符串' filename;
-a:将Binary文件已text文件的方式查找数据;
-c:计算找到'查找字符串'的次数;
-i:忽略大小写的不同;
-n:输出行号;
-v:反向选择,即显示没有'查找字符串'内容的哪一行;
--color=auto:可以将找到的关键字部分加上颜色显示;
如:将last当中有出现root的那一行取出来:
[yonghu@CentOS learn]$ last | grep 'root'
root tty2 Sat Jun 21 15:55 - 16:00 (00:04)
如:将last中没root的取出:
[yonghu@CentOS learn]$ last | grep -v 'root'
root tty2 Sat Jun 21 15:55 - 16:00 (00:04)
如:在last输出的信息中,只要有root就取出,并且仅取第一列:
[yonghu@CentOS learn]$last | grep 'root' | cut -d ' ' -f1
root
(5)排序:sort [-fbMnrtuk] [file or stdin];
-f:忽略大小写的差异;
-b:忽略最前面的空格符部分;
-M:以月份的名字排序,如JAN,DEC等的排序方法;
-n:用纯数字进行排序;
-r:反向排序;
-t:分隔符,默认是用[Tab]键来分隔;
-u:uniq,相同的数据中,仅出现一行;
-k:以区间(field)来进行排序;
如:/etc/passwd内容是以“:”来分隔,将第三列进行排序:
[yonghu@CentOS learn]$cat /etc/passwd | sort -t':' -k 3
如:利用last将输出的数据仅取账号,并加以排序:
[yonghu@CentOS learn]$last | cut -d ' ' -f1 | sort
(6)唯一:uniq [-ic];
-i:忽略大小写;
-c:计数;
如:用last将账号列出,仅取出账号列,排序后取出一位,并统计每人的登录次数:
[yonghu@CentOS learn]$last | cut -d ' ' -f1 | sort | uniq -c
1
79 yonghu
36 reboot
1 root
1 wtmp
(7)统计文件中的字数、行数:wc [-lwm];
-l:仅列出行;
-w:列出多少字(英文单字);
-m:统计字符;
如:用last取出登录者,但是last最后两行并非账号内容,如何以一行命令取得这个月份登录系统的总人数:
[yonghu@CentOS learn]$last | grep [a-zA-Z] | grep -v 'wtmp'| wc -l
(8)双向(同时将数据流送与文件与屏幕)重定向:tee [-a] file;
-a:以累加方式将数据加入file中;
(9)删除/替换文字信息:tr [-ds] SET1...;
-d:删除信息中SET1这个字符串;
-s:替换重复的字符;
如:将last输出的信息中小写字符变大写:
[yonghu@CentOS learn]$ last | tr -s [a-z] [A-Z]
(10)col [-xb];
-x:将tab键转换为对等的空格键;
-b:在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符;
注:col常被利用于将man page转存为纯文本文件以方便查阅;
(11)将两个文件中有相同数据的那一行加在一起:join [-ti12] file1 file2;
-t:分隔符,默认为空格,若两文件相同,则将两条数据练成一行,且第一个字段放第一个;
-i:忽略大小写;
-1:第一个文件用哪个字段来分析;
-2:第二个文件用哪个字段来分析;
如:/etc/passwd第四个字段是GID,那个GID记录在/etc/group中的第三个字段,如何将两文件整合:
join -t ':' -1 4 /etc/passwd -2 3 /etc/group
(12)将两行贴在一起,并以[tab]键隔开:paste [-d] file1 file2;
-d:后接分隔字符,默认为tab键;
-:若file部分写成-,表示来自standard input的数据;
(13)将[tab]键转换为空格键:expand [-t] file;
-t:后可接数字,定义tab键代表多少个字符;
(14)将空白转为tab键:unexpand;
(15)切割命令:split [-bl] file PREFIX;
-b:后接欲切割的文件的大小,可加单位;
-l:以行数进行切割;
PREFIX:前导符,可作为切割文件的前导文字;
如:将splitFile1aa文件分为50一个文件:
[yonghu@CentOS learn]$ split -b 50 splitFile1aa qie
[yonghu@CentOS learn]$ ll
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieaa
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieab
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieac
-rw-rw-r--. 1 yonghu yonghu 26 2月 8 16:44 qiead
-rw-rw-r--. 1 yonghu yonghu 176 1月 1 20:32 splitFile1aa
如:将上面的四个小文件合成一个文件,文件名为qieback:
[yonghu@CentOS learn]$ cat qiea* >> qieback
[yonghu@CentOS learn]$ ll
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieaa
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieab
-rw-rw-r--. 1 yonghu yonghu 50 2月 8 16:44 qieac
-rw-rw-r--. 1 yonghu yonghu 26 2月 8 16:44 qiead
-rw-rw-r--. 1 yonghu yonghu 176 2月 8 16:45 qieback
-rw-rw-r--. 1 yonghu yonghu 176 1月 1 20:32 splitFile1aa
(16)参数代换:xargs [-0epn] command;
-0:若输入的stdin含有特殊字符,可将它还原为一般字符;
-e:end of file,后接字符串,当xargs分析到该字符串时,停止工作;
-p:询问用户;
-n:后接次数,每次执行command命令执行时,要使用几个参数的意思;command默认为echo;
注:因为好多命令不支持管道命令,因此可通过xargs提供该命令引用standard input之用;
如:找出/sbin下具有特殊权限的文件名,并用ls -l列出详细属性:
[yonghu@CentOS]$ find /sbin/ -perm +7000 | xargs ls -al
-rwsr-xr-x. 1 root root 122784 11月 22 2013 /sbin/mount.nfs
-rwxr-sr-x. 1 root root 6180 11月 23 2013 /sbin/netreport
-rwsr-xr-x. 1 root root 9596 11月 22 2013 /sbin/pam_timestamp_check
-rwsr-xr-x. 1 root root 34168 11月 22 2013 /sbin/unix_chkpwd
注:若不加xargs,列出的是当前所在目录下的文件属性;
(17)减号用途:在管道命令中,会使用到前一个命令的stdout作为这次的stdin,某些命令要用到文件名(如tar)进行处理时,该stdin与stdout可利用减号替代;
12.bash的内置命令:type [-tpa] name;
不加任何参数,type会显示出那么是外部命令还是bash的内置命令;
-t:type会将name以下面的字眼显示出它的意义:
file:表示外部命令;
alias:表示该命令为命令别名所设置的名称;
builtin:表示该命令为bash内置的命令;
-a:后接的name为外部命令时,才会显示完整的文件名;
-p:会由PATH变量定义的路径中,将所有含name的命令都列出来,包括alias;
如:type -a ls
ls is aliased to 'ls --color=tty'
ls is /bin/ls
13.命令换行:若觉得命令不想一行输入完,要换行输,可以加“\+[Enter]”;