Linux学习笔记(七)——初识bash
初识Shell——bash
Linux中的shell有点类似Windows下的cmd.exe或者.bat。管理整个计算机硬件的其实是操作系统的内核(Kernel),用户无法与内核直接交互,所以通过shell来跟内核通信。即shell介于操作系统(Kernel)和用户之间,它是用户与内核的翻译官,是一个命令解释器。
常见的shell种类有:Bsh、Csh、Ksh、Bash、Zsh
Bsh和Csh出现的较早,Ksh继承了它两的功能,Bash继承了Bsh和Ksh的升级版,而且是Linux系统中默认的shell,Zsh则兼具了各种shell的程序有点,交互式操作效率更高,但仍不及bash应用广泛。
Shell环境的切换:
登录Shell:指用户每次登录系统后自动加载的Shell程序,大多数Linux系统采用 /bin/bash 作为默认登录Shell;/etc/shells 文件记录了系统支持的有效登录Shell
[root@localhost ~]# cat /etc/shells ==>使用chsh -l命令也可查看 /bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh /bin/ksh [root@localhost ~]#
默认的shell是bash,那么如何切换shell环境呢?分为两种,一种是临时切换,即当此终端关闭时,下次启动仍然是bash,方法很简单,直接在终端输入shell名称;第二种则是更改用户登录Shell,需要修改/etc/passwd文件中用户记录的最后一个字段,或者像前面讲到的使用修改用户的命令:usermod -s shell程序路径 用户名,也可以使用chsh命令,下次登录有效。
查看当前shell可以通过/etc/passwd来查看,要查看系统默认使用的shell,可以使用echo $SHELL。
bash的常用功能:
类型 |
设备文件 |
文件描述编号 |
默认设备 |
标准输入 |
/dev/stdin |
0 |
键盘 |
标准输出 |
/dev/stdout |
1 |
显示器 |
标准错误输出 |
/dev/stderr |
2 |
显示器 |
(备注:/dev/stdin、/dev/stdout、/dev/stderr这三个文件是一个符号链接,输入输出与重定向关系紧密)
类型 |
操作符 |
用途 |
重定向标准输入 |
< |
将命令中接收输入的途径由默认的键盘更改为指定的文件 |
重定向标准输出 |
> |
将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上 |
>> |
将命令执行的结果追加输出到指定文件 |
|
重定向标准错误 |
2> |
清空指定文件的内容,并将标准错误信息保存到该文件中 |
2>> |
将标准错误信息追加输出到指定的文件中 |
|
重定向标准输出和 标准错误 |
&> |
将标准输出、标准错误的内容全部保存到指定的文件中,而不是直接显示在屏幕上 |
管道操作符号是“|”,连接左右两个命令,将左侧的命令输出的结果,作为右侧命令的输入(处理对象)。管道是脚本语言的特色,它可以讲多个功能连接起来形成一个大的功能,这点与面向对象有很大的不同。
例如我现在要查看历史记录命令的第4行:则可先将前4条命令显示出来,在显示前4条命令的最后一条:history | head -4 | tail -1 这样即取出了第四条命令。
Shell变量
Shell变量和其他语言的变量含义大同小异,就是可以存放不同的内容,它也为灵活管理Linux系统提供特定参数。一般有两层意思:变量名:使用固定的名称,由系统预设或用户定义;变量值:能够根据用户设置、系统环境变化而变化。
Shell变量的种类:
变量的赋值与引用:
定义新的变量名要以英文字母或下划线开头,区分大小写,格式为:变量名=变量值
查看变量的值:echo $变量名
[root@localhost ~]# DAY=Sunday [root@localhost ~]# echo $DAY ==>通过$符号引用指定名称的变量值 Sunday [root@localhost ~]#
(注意:在查看变量时,如果变量名容易和后边的字符串连在一起导致混淆,则应该使用大括号将变量名括起来,使用形式为:${变量名} ,例如: 若已知变量Var的值为Benet,则执行“echo $Var3.0”命令后将显示结果“.0”而不是“Benet3.0”,因为在该命令中,会将“Var3”当成变量名(默认未定义此变量)。若希望正确显示“Benet3.0”的输出结果,则需要执行“echo ${Var}3.0”)
[root@localhost ~]# Var =Benet [root@localhost ~]# echo $Var Benet [root@localhost ~]# echo $Var3.0 .0 [root@localhost ~]# echo ${Var}3.0 Benet3.0 [root@localhost ~]#
从键盘输入内容为变量赋值,格式为:read [-p "输入信息"] 变量名
[root@localhost ~]#read var haha ==>这里等待输入 [root@localhost ~]#echo $var haha [root@localhost ~]#
在给变量赋值时,使用不同的引号操作的区别:
[root@localhost ~]#name=jzhou [root@localhost ~]#echo $name jzhou [root@localhost ~]#myname="$name is me" ==>这里使用的是双引号 [root@localhost ~]#echo $myname jzhou is me ==>将$name这个变量执行出来了 [root@localhost ~]#myname='$name is me' ==>这里使用的是单引号 [root@localhost ~]#echo $myname $name is me ==>原样显示出来了,$name没有执行 [root@localhost ~]#
[jzhou@localhost ~]$ locate crontab /etc/anacrontab /etc/crontab /usr/bin/crontab /usr/share/man/man1/crontab.1.gz ..... [jzhou@localhost ~]$ ls -l `locate crontab` ==>先执行locate crontab,再执行ls -l -rw-r--r-- 1 root root 298 2006-12-18 /etc/anacrontab -rw-r--r-- 1 root root 255 2006-07-15 /etc/crontab -rwsr-sr-x 1 root root 315416 2008-07-15 /usr/bin/crontab -rw-r--r-- 1 root root 1846 2008-07-15 /usr/share/man/man1/crontab.1.gz ..... [jzhou@localhost ~]$
设置变量的作用范围,格式:export 变量名
一般情况下,父进程的自定义变量是无法在子进程中使用的,但是通过export将变量变成环境变量后,就能够在子进程下使用了。
[root@localhost ~]#name=jzhou [root@localhost ~]#echo $name jzhou [root@localhost ~]# export name ==>输出为全局变量 [root@localhost ~]# zsh [root@localhost]~# echo $name jzhou [root@localhost]~# exit [root@localhost root]# unset name==>消除变量内容 [root@localhost root]# echo $name [root@localhost ~]#
变量还有一个好处,当您经常访问一个目录时,而且这个目录比较长,可以将它付给一个简单的变量,这样进入这个目录时候只需cd 变量就行了。如work="~/temp/2013/test/",则进入这个目录只需cd work。
数值变量的运算:
之前讲到过可以使用命令bc来打开一个计算器,其实Bash程序并不适合进行强大的数学运算,例如小数或指数运算的,一般只能进行简单的整数运算,若不使用bc,则也可以使用下列格式来进行简单数值计算:
格式:expr 变量1 运算符 变量2 [..运算符 变量n...]
expr命令常用的运算符有:+、-、\*(注意要有\)、/、%
[jzhou@localhost ~]$ expr 10 * 2 expr :语法错误 [jzhou@localhost ~]$ expr 10 \* 2 20 [jzhou@localhost ~]$expr 10 + 2 12 [jzhou@localhost ~]$
环境变量
环境变量配置文件:全局配置文件:/etec/profile
用户配置文件:~/.bash_profile
查看环境变量:env
set (set命令可以查看所有的Shell变量,其中包括环境变量)
常见的环境变量:
位置变量:
表示为$n,n为1~9之间的数字,$n的作用就是为脚本文件传递执行参数。
[jzhou@localhost ~]ls -a -l -l ==>a就是第1个位置变量,依次类推,其实这个命令就是ls -al
预定义变量:
[root@localhost ~]# bash [root@localhost ~]# echo $0 $$ ==>查看当前所执行进程的名称、PID号 -bash 32484 [root@localhost ~]# exxit ==>执行一条错误的命令 bash: exxit: command not found [root@localhost ~]# echo $? 127 ==>返回非0值,表示上一条命令异常 [root@localhost ~]# exit exit [root@localhost ~]# echo $? 0 ==>返回0,说明上一条命令正常
灵活使用这些变量,将大大增强Shell脚本程序的功能,$0作为预定义变量,表示当前执行的程序名,需要与$1~$9的位置变量区分开。
引入shell脚本
shell脚本:
[root@localhost ~]# vi repboot.sh #!/bin/bash ==>声明使用的shell环境,根据执行的方式不同可加可不加 # To show usage of /boot directory and mode of kernel file. echo "Useage of /boot: " du -sh /boot echo "The mode of kernel file:" ls -lh /boot/vmlinuz-* [root@localhost ~]# chmod a+x repboot.sh
如有错误,欢迎指正。