bash的内置命令

常用的内置命令忽略,来看看shell编程中其他一些重要的内置命令:
       
1、help:显示所有内置命令列表,或显示一个具体命令的用法。
          -s:  表示列出命令的语法格式
     例子:help -s help
help: help [-dms] [pattern ...]

2、echo:用来显示一行文字。默认自动换行。
      -n:取消自动换行。
      -e:让字符串中的特殊字符起作用。
      例子:echo hello world  或 echo 'hello world'  或 echo "hello world" 输出结果为:hello world
                  echo -e "hello \n world"  输出结果为:
hello
world

3、printf:显示格式字符串,类似于c中的printf函数
      格式:printf “格式字符串” 参数
         -v :不显示到标准输出,而是赋值给-v选项后面的变量
      例子:
str= "hello world"
printf "%s\n" "$str"     执行结果:hello world

printf -v str "hello world"
echo $str                      执行结果:hello world

printf "%q" "hello world \n" 执行结果:hello\ world\\n 无换行
%q这个选项我想了很久才弄明白它的含义:
将字符串或变量中的转义字符 用 源码格式替换。于是,上面的例子中,空格变成了\空格,\变成了\\,而且\n没有了换行的作用

printf详细用法请参考博客:

4、:  :什么也不做,返回0
     例子:
:
echo $?                    运行结果:0

5、.  或 source :在现行shell中执行shell程序
      例子:
编辑脚本文件a_var.sh:
#!/bin/bash
a=31
保存退出后回到终端,修改a_var.sh的权限并输入命令:
./a_var.sh
执行,然后在终端执行:
echo $a
输出结果为一个空行,意味着变量a的值为空
我们再以命令:
.空格a_var.sh  或
source a_var.sh  执行,然后输入:
echo $a                     其输出结果为:  31
第一种方式执行a_var.sh,bash会创建一个shell去执行,当子shell执行完成后,它的变量a会被系统收回。

6、alias:显示或设定程序别名
    例子:
alias          执行结果:列出所有的别名
alias ll='ls -al' 
ll               执行结果:等价于执行了  ls -al

7、unalias:取消别名
alias ll

8、exit :离开脚本或登录shell,可带返回值
exit 1

9、history:显示过去曾经执行过的shell指令
      与history命令相关的有三个重要的变量:
HISTFILE :记录存放历史命令文件的路径,如:
echo $HISTFILE                    结果为:/home/kelvin/.bash_history
HISTFILESIZE:设置历史命令文件命令的最大个数,超过这个个数,序号在前的命令记录就会被删除
HISTSIZE:设置终端中交互式命令的历史记录个数。它和HISTFILESIZE相比的最小值起作用。

10、fc:列出登录主机后最近执行过的命令。一般和选项 -l 配合使用。
        例子:
fc -l      结果:
363 cat /etc/profile
364 echo $HISTORY
365 echo $HISTORYFILE
366 echo $HISTFILE
367 ehco $HISTFILESIZE
368 echo $HISTFILESIZE
369 echo $HISTSIZE
370 history
371 history
372 echo $HISTFILE
373 lw
374 ls
375 fc -l
376 fc -l 368
377 fc -l echo l
378 fc -l
fc -l 375     列出375行以后的命令                输出结果:
375 fc -l
376 fc -l 368
377 fc -l echo l
378 fc -l
fc -l 375 377 列出375到377之间的命令          输出结果:
375 fc -l
376 fc -l 368
377 fc -l echo l
fc -l echo  l    列出从 关键字 echo 到 l之间的内容     输出结果:
372 echo $HISTFILE
373 lw
374 ls

11、type:对一个命令的类型进行说明(包含命令行程序)。
      例子:
type ls
ls 已被别名为“ls --color=auto”
type cp
cp 是 /bin/cp
type fc
fc 是一个 shell 内部命令

12、set:列出所有变量和函数的内容,加入选项可以设置bash的某个属性是否打开
       例子:
set -o 查看所有属性,或打开某个属性
allexport      off
braceexpand    on
emacs          on
errexit        off
errtrace       off
functrace      off
hashall        on
histexpand     on
history        on
ignoreeof      off
interactive-comments on
keyword        off
monitor        on
noclobber      off
noexec         off
noglob         off
nolog          off
notify         off
nounset        off
onecmd         off
physical       off
pipefail       off
posix          off
privileged     off
verbose        off
vi             off
xtrace         off

set -o notify
set -o              打开notify属性后显示所有属性状态,输出结果:
allexport      off
braceexpand    on
emacs          on
errexit        off
errtrace       off
functrace      off
hashall        on
histexpand     on
history        on
ignoreeof      off
interactive-comments on
keyword        off
monitor        on
noclobber      off
noexec         off
noglob         off
nolog          off
notify         on
nounset        off
onecmd         off
physical       off
pipefail       off
posix          off
privileged     off
verbose        off
vi             off
xtrace         off

set  +o notify
set -o         关闭notify属性,并显示所有属性状态:
allexport      off
braceexpand    on
emacs          on
errexit        off
errtrace       off
functrace      off
hashall        on
histexpand     on
history        on
ignoreeof      off
interactive-comments on
keyword        off
monitor        on
noclobber      off
noexec         off
noglob         off
nolog          off
notify         off
nounset        off
onecmd         off
physical       off
pipefail       off
posix          off
privileged     off
verbose        off
vi             off
xtrace         off

set -C 或 set -o noclobber :保护已存在文件,不让重定向覆盖文件内容,只能追加。
例如:
set -C
touch a.c
echo adfad >  a.c  提示出错:
bash: a.c:无法覆盖已经存在的文件
但当我们追加内容时不会提示出错:
echo adfasf >> a.c
可用set +C 取消

set -u:用于测试变量是否存在
例如:
: $i
echo $?  这儿的返回值应该为1,因为变量i不存在
i=1
: $i
echo $?  这儿的输出结果应该是0
同样可以用set +u取消作用

set -v:显示当前shell的每一个执行命令,换句话说,就是把执行的命令打印出来
例如:
kelvin@kelvin-Founder:~$ set -v
kelvin@kelvin-Founder:~$ ls
ls
a.c  Linux material  project_files  record  shell  software  桌面
可用于对shell脚本的排错
该属性可用set +v取消作用

13、shopt:很多方面都和set命令一样,但它增加了很多选项。
-s:开启选项
-u:关闭选项
-o:set -o
-q:以返回值的形式表示开关状态,非0表示关,0表示开

set和shopt 的细节参见:

14、read:从标准输入读取一行数据
例子:
#!/bin/bash
echo "please input your name "
read your_name                             //如果不输入your_name,读取结果会默认存入变量ERPLY
echo "your name is :"  $your_name   执行结果:
please in put your name
kelvin
your name is : kelvin

read -p "提示信息"  ;所以上述sh脚本也可写成:
#!/bin/bash
read -p "please input your name" your_name
echo "your name is:" $your_name

read -a arr:将一行数据存入数组arr
例如:
read -a arr <<(echo 1 2 343 23)
这样,echo ${arr[2]} 的输出结果就是343

read还可以读值给多个变量:
IFS=':'
read f1 f2 f3 f4 f5 f6 f7 < /etc/passwd
因为passwd中7个字段是由:分割开的,所以IFS=':'

15、time:打印设置命令执行的real user sys时间,real 表示命令真正运行时间,cpu使用时间由两部分表示: user表示用户态程序执行时间, sys 表示系统调用时间。
例如:
time ls
time ls
adf.sh  a_var.sh  name.sh

real 0m0.004s
user 0m0.000s
sys 0m0.000s

16、exec:后接命令或程序,执行命令或程序,并取代原来的shell执行环境;
                      执行重定向生效,例如:
exec < file  那么凡是由标准输入读入数据的操作都改为由file读入数据

17、eval:读取变量,并将变量的内容作为命令执行
例如:
listlog="ls -al /var/log/*.log"
eval $listlog
执行结果:ls -al /var/log/*.log将被执行。
 
18、 cat 命令详解使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
范例:
把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat -b textfile1 textfile2 >> textfile3
cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
cat 也可以用来制作 image file。例如要制作软碟的 image file,将软碟放好后打
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软碟,请打
cat IMG_FILE > /dev/fd0
注:
1. OUTFILE 指输出的 image 档名。
2. IMG_FILE 指 image file。
3. 若从 image file 写回 device 时,device 容量需与相当。
4. 通常用在制作开机磁片。

cat主要有三大功能:
1.一次显示整个文件。$ cat   filename
2.从键盘创建一个文件。$ cat  >  filename 
只能创建新文件,不能编辑已有文件. :z)
3.将几个文件合并为一个文件。 $cat   file1   file2  > file
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
范例:
把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat -b textfile1 textfile2 >> textfile3
cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
cat 也可以用来制作 image file。例如要制作软碟的 image file,将软碟放好后打
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软碟,请打
cat IMG_FILE > /dev/fd0
注:
1. OUTFILE 指输出的 image 档名。
2. IMG_FILE 指 image file。
3. 若从 image file 写回 device 时,device 容量需与相当。
4. 通常用在制作开机磁片。
19、cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

(1)其语法格式为:
cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f  :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

(3)以“字节”定位

举个例子吧,当你执行ps命令时,会输出类似如下的内容:

[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
如果我们想提取每一行的第3个字节,就这样:

[rocrocket@rocrocket programming]$ who|cut -b 3
c
c
c

(4) 如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办?

-b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:

[rocrocket@rocrocket programming]$ who|cut -b 3-5,8
croe
croe
croe
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦。这个例子就可以说明这个问题:

[rocrocket@rocrocket programming]$ who|cut -b 8,3-5
croe
croe
croe
(5) 还有哪些类似“3-5”这样的小技巧,列举一下吧!

[rocrocket@rocrocket programming]$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
[rocrocket@rocrocket programming]$ who|cut -b -3
roc
roc
roc
[rocrocket@rocrocket programming]$ who|cut -b 3-
crocket :0           2009-01-08 11:07
crocket pts/0        2009-01-08 11:23 (:0.0)
crocket pts/1        2009-01-08 14:15 (:0.0)
想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”。
如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。看:

[rocrocket@rocrocket programming]$ who|cut -b -3,3-
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
(6)给个以字符为定位标志的最简单的例子吧!

下面例子你似曾相识,提取第3,第4,第5和第8个字符:

[rocrocket@rocrocket programming]$ who|cut -c 3-5,8
croe
croe
croe
不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

[rocrocket@rocrocket programming]$ cat cut_ch.txt
星期一
星期二
星期三
星期四
[rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt




[rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt




看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。
既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。
当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。例子如下:

[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2




[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2

[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3




(7)域是怎么回事呢?解释解释:)

为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。

我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

以/etc/passwd的前五行内容为例:

[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp
看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧!
当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:

[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin
[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2
root:x
bin:x
daemon:x
adm:x
lp:x
(8)如果遇到空格和制表符时,怎么分辨呢?我觉得有点乱,怎么办?

有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

[rocrocket@rocrocket programming]$ cat tab_space.txt
this is tab finish.
this is several space      finish.
[rocrocket@rocrocket programming]$ sed -n l tab_space.txt
this is tab\tfinish.$
this is several space      finish.$
看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。
通过此方法即可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母哦,不要看错。

(9)我应该在cut -d中用什么符号来设定制表符或空格呢?

其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。

如果你设定一个空格为间隔符,那么就这样:

[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1
this
this
注意,两个单引号之间可确实要有一个空格哦,不能偷懒。
而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。

[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1
cut: the delimiter must be a single character
Try `cut --help' for more information.

(10)cut有哪些缺陷和不足?

猜出来了吧?对,就是在处理多空格时。
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容


posted @ 2013-03-29 22:29  ~风~  阅读(488)  评论(0编辑  收藏  举报