免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1194 | 回复: 0
打印 上一主题 下一主题

Linux学习之bash shell初探 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-20 10:32 |只看该作者 |倒序浏览
认识bash shell
**type:查看指令是外部命令还是内建在bash当中的。
[root@linux ~]# type [-tpa] name
参数∶
    ∶不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!
-t  ∶当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义∶
      file    ∶表示为外部指令;
      alias   ∶表示该指令为命令别名所设定的名称;
      builtin ∶表示该指令为 bash 内建的指令功能;
-p  ∶如果后面接的 name 为指令时,会显示完整档名(外部指令)或显示为内建指令;
-a  ∶会将由 PATH 变数定义的路径中,将所有含有 name 的指令都列出来,包含 alias
范例∶
范例一∶查询一下 ls 这个指令是否为 bash 内建?
[root@linux ~]# type ls
ls is aliased to `ls --color=tty'
# 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况
[root@linux ~]# type -t ls
alias
# -t 参数则仅列出 ls 这个指令的最主要使用情况说明
[root@linux ~]# type -a ls
ls is aliased to `ls --color=tty'
ls is /bin/ls
# 利用所有方法找出来的 ls 相关资讯都会被列出来!
范例二∶那么 cd 呢?
[root@linux ~]# type cd
cd is a shell builtin
这个 type 也可以用来作为类似 which 指令的用途啦!找指令用的!
**bash中定义变量应该注意的要点:
   1. 变量与变量内容以等号『=』来连结;
   2. 等号两边不能直接接空白字元;
   3. 变量名称只能是英文字母与数字,但是数字不能是开头字元,和C++标识符类似;
   4. 若有空白字元可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意,
      双引号内的特殊字元可以保有变量特性,但是单引号内的特殊字元则仅为一般字元;
   5. 必要时需要以转义字符『 \ 』来将特殊符号 ( 如 Enter, $, \, 空白字元, ' 等 ) 变成一般符号;
   6. 在一串指令中,还需要藉由其他的指令提供的资讯,可以使用 quote 『 ` command` 』;(特别
      特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)
   7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称 如∶『 "$PATH":/home』继续累加内容;
   8. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量, 如『export PATH』;
   9. 通常大写字元为系统预设变量,自行设定变量可以使用小写字元,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;
  10. 取消变量的方法为∶『unset 变量名称』。
范例一∶设定一变数 name ,且内容为 VBird 。
[root@linux ~]# 12name=VBird
-bash: 12name=VBird: command not found   或 >> ;(>>是以追加方式输出到文件)
   3. 标准错误输出(stderr)∶代码为 2 ,使用 2> 或 2>> ;
重定向以后信息不会在屏幕显示,需要在屏幕上显示的同时输出到文件可以使用tee命令:
[root@linux ~]# tee [-a] file
参数∶
-a  ∶以累加 (append) 的方式,将资料加入 file 当中!
范例∶
[root@linux ~]# last | tee last.list | cut -d " " -f1
# 这个范例可以让我们将 last 的输出存一份到 last.list 档案中;
[root@linux ~]# ls -l /home | tee ~/homefile | more
# 这个范例则是将 ls 的资料存一份到 ~/homefile ,同时萤幕也有输出讯息!
[root@linux ~]# ls -l / | tee -a ~/homefile | more
# 要注意∶ tee 后接的档案会被覆盖,所以,我们要加上 -a
# 这个参数才能将讯息累加。
命令执行的判断依据∶ ; , &&, ||
;前一个命令执行完毕后执行下一个命令。
&&前一个命令执行成功(即$?=0)后再执行下一个命令。
||前一个命令执行错误时才会执行下一个命令。
撷取命令∶ cut, grep
[root@linux ~]# cut -d'分隔字元' -f fields
[root@linux ~]# cut -c 字元区间
参数∶
-d  ∶后面接分隔字元。与 -f 一起使用;
-f  ∶依据 -d 的分隔字元将一段讯息分割成为数段,用 -f 取出第几段的意思;
-c  ∶以字元 (characters) 的单位取出固定字元区间;
范例∶
范例一∶将 PATH 变数取出,我要找出第三个路径。
[root@linux ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
[root@linux ~]# echo $PATH | cut -d ':' -f 5
# 嘿嘿!如此一来,就会出现 /usr/local/bin 这个目录名称!
# 因为我们是以 : 作为分隔符号,第五个就是 /usr/local/bin 啊!
# 那么如果想要列出第 3 与第 5 呢?,就是这样∶
[root@linux ~]# echo $PATH | cut -d ':' -f 3,5
范例二∶将 export 输出的讯息,取得第 12 字元以后的所有字串
[root@linux ~]# export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5"
......其他省略......
[root@linux ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"
......其他省略......
# 知道怎么回事了吧?用 -c 可以处理比较具有格式的输出资料!
# 我们还可以指定某个范围的值,例如第 12-20 的字元,就是 cut -c 12-20 等等!
范例三∶用 last 将这个月登入者的资讯中,仅留下使用者大名
[root@linux ~]# last
vbird  tty1  192.168.1.28   Mon Aug 15 11:55 - 17:48  (05:53)
vbird  tty1  192.168.1.28   Mon Aug 15 10:17 - 11:54  (01:37)
[root@linux ~]# last | cut -d ' ' -f 1
# 用 last 可以取得最近一个月登入主机的使用者资讯,
# 而我们可以利用空白字元的间隔,取出第一个资讯,就是使用者帐号棉!
# 但是因为 vbird tty1 之间空格有好几个,并非仅有一个,所以,如果要找出
# tty1 其实不能以 cut -d ' ' -f 1,2 喔!输出的结果会不是我们想要的。
grep:
[root@linux ~]# grep [-acinv] '搜寻字串' filename
参数∶
-a ∶将 binary 档案以 text 档案的方式搜寻资料
-c ∶计算找到 '搜寻字串' 的次数
-i ∶忽略大小写的不同,所以大小写视为相同
-n ∶顺便输出行号
-v ∶反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!
范例∶
范例一∶将 last 当中,有出现 root 的那一行就取出来;
[root@linux ~]# last | grep 'root'
范例二∶与范例一相反,只要没有 root 的就取出!
[root@linux ~]# last | grep -v 'root'
范例三∶在 last 的输出讯息中,只要有 root 就取出,并且仅取第一栏
[root@linux ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之后,利用上个指令 cut 的处理,就能够仅取得第一栏棉!
排序命令∶ sort, wc, uniq
sort排序的字符与语系的编码有关,因此, 如果您需要排序时,建议使用 LC_ALL=C 来让语系统一,
资料排序比较好一些。
[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
参数∶
-f  ∶忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  ∶忽略最前面的空白字元部分;
-M  ∶以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  ∶使用『纯数字』进行排序(预设是以文字型态来排序的);
-r  ∶反向排序;
-u  ∶就是 uniq ,相同的资料中,仅出现一行代表;
-t  ∶分隔符号,预设是 tab 键;
-k  ∶以那个区间 (field) 来进行排序的意思,
范例∶
范例一∶个人帐号都记录在 /etc/passwd 下,请将帐号进行排序。
[root@linux ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 我省略很多的输出~由上面的资料看起来, sort 是预设『以第一个』资料来排序,
# 而且预设是以『文字』型态来排序的喔!所以由 a 开始排到最后棉!
范例二∶/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何?
[root@linux ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
iiimd:x:100:101:IIIMF server:/usr/lib/iiim:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
# 看到特殊字体的输出部分了吧?怎么会这样排列啊?呵呵!没错啦~
# 如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序∶
# cat /etc/passwd | sort -t ':' -k 3 -n
# 这样才行啊!用那个 -n 来告知 sort 以数字来排序啊!
范例三∶利用 last ,将输出的资料仅取帐号,并加以排序
[root@linux ~]# last | cut -d ' ' -f1 | sort
uniq:相同的行之列出一次
[root@linux ~]# uniq [-ic]
参数∶
-i  ∶忽略大小写字元的不同;
-c  ∶进行计数
范例∶
范例一∶使用 last 将帐号列出,仅取出帐号栏,进行排序后仅取出一位;
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq
范例二∶承上题,如果我还想要知道每个人的登入总次数呢?
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c
wc:计算行数、字数和字符数
[root@linux ~]# wc [-lwm]
参数∶
-l  ∶仅列出行;
-w  ∶仅列出多少字(英文单字);
-m  ∶多少字元;
范例∶
范例一∶那个 /etc/man.config 里面到底有多少相关字、行、字元数?
[root@linux ~]# cat /etc/man.config | wc
    138     709    4506
# 输出的三个数字中,分别代表∶ 『行、字数、字元数』
范例二∶我知道使用 last 可以输出登入者,但是 last 最后两行并非帐号内容,
        那么请问,我该如何以一行指令串取得这个月份登入系统的总人次?
[root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
# 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解!
tr:删除一段信息中的文字或者进行文字替换:
[root@linux ~]# tr [-ds] SET1 ...
参数∶
-d  ∶删除讯息当中的 SET1 这个字串;
-s  ∶取代掉重复的字元!
范例∶
范例一∶将 last 输出的讯息中,所有的小写变成大写字元∶
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
范例二∶将 /etc/passwd 输出的讯息中,将冒号 (:) 删除
[root@linux ~]# cat /etc/passwd | tr -d ':'
范例三∶将 DOS 档案的断行字元 ^M 符号删除∶
[root@linux ~]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM
# 那个 /r 指的是 DOS 的断行字元,关于更多的字符,请参考 man tr
col:转换Tab键
[root@linux ~]# col [-x]
参数∶
-x  ∶将 tab 键转换成对等的空白键
范例∶
[root@linux ~]# cat -A /etc/man.config  > termcapback
# 很简单吧?就用资料流重导向就好啦!简单!
范例三∶使用 ls -al / 输出的资讯中,每十行记录成一个档案
[root@linux tmp]# ls -al / | split -l 10 - lsroot
# 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有档案,
# 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout ~
参数代换∶ xargs
xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成
为 arguments作为其后的命令的参数。
[root@linux ~]# xargs [-0epn] command
参数∶
-0  ∶如果输入的 stdin 含有特殊字元,例如 `, \, 空白键等等字元时,这个 -0 参数
      可以将他还原成一般字元。这个参数可以用于特殊状态喔!
-e  ∶这个是 EOF (end of file) 的意思。后面可以接一个字串,当 xargs 分析到
      这个字串时,就会停止继续工作!
-p  ∶在执行每个指令的 argument 时,都会询问使用者的意思;
-n  ∶后面接次数,每次 command 指令执行时,要使用几个参数的意思。看范例三。
当 xargs 后面没有接任何的指令时,预设是以 echo 来进行输出喔!
范例∶
范例一∶将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个指令将每个
        帐号内容秀出来
[root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs finger
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
No mail.
No Plan.
......底下省略.....
# 由 finger account 可以取得该帐号的相关说明内容,例如上面的输出就是 finger root
# 后的结果。在这个例子当中,我们利用 cut 取出帐号名称,用 head 取出三个帐号,
# 最后则是由 xargs 将三个帐号的名称变成 finger 后面需要的参数!
范例二∶同上,但是每次执行 finger 时,都要询问使用者是否动作?
[root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs -p finger
finger root bin daemon ?...y
......底下省略.....
# 呵呵!这个 -p 的参数有趣了吧?!他可以让使用者的使用过程中,被询问到每个
# 指令是否执行!
范例三∶将所有的 /etc/passwd 内的帐号都以 finger 查阅,但一次仅查阅五个帐号
[root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -n 5 finger
finger root bin daemon adm lp ?...y
......底下省略.....
# 在这里鸟哥使用了 -p 这个参数来让您对于 -n 更有概念。一般来说,某些指令后面
# 可以接的 arguments 是有限制的,不能无限制的累加,此时,我们可以利用 -n
# 来帮助我们将参数分成数个部分,每个部分分别再以指令来执行!这样就 OK 啦!^_^
[root@linux ~]#
范例四∶同上,但是当分析到 lp 就结束这串指令?
[root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -e'lp' finger
finger root bin daemon adm ?...
# 仔细与上面的案例做比较。也同时注意,那个 -e'lp' 是连在一起的,中间没有空白键。
# 上个例子当中,第五个参数是 lp 啊,那么我们下达 -e'lp' 后,则分析到 lp
# 这个字串时,后面的其他 stdin 的内容就会被 xargs 舍弃掉了!
上面的finger命令是显示用户的详细信息。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/97264/showart_1971224.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP