Linux学习笔记(15)shell基础之Bash基本功能
1 shell概述
shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。用户可以用shell启动、挂起、停止甚至是编写一些程序。
shell是一个功能强大的编程语言,其特点是易编写、易调试及灵活性强。shell是解释执行的脚本语言,可直接调用Linux系统命令。
shell通常分为两类:B shell和C shell。前者的主文件名为sh,后者主要用于BSD版本的Unix中,其语法格式和C语言类似。这两种shell的语法彼此间不兼容。Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本shell。
Linux支持的shell可查看/etc/shells配置文件:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
可通过输入其相应命令进行互相转换,如使用sh:
[root@localhost ~]# sh
sh-4.1#
sh-4.1# exit
exit
[root@localhost ~]#
2 shell脚本的执行方式
1)echo命令用于输出信息,其格式为:
echo [选项] [输出内容]
其中,-e选项支持反斜线控制的字符转换。常见的控制字符如下表:
|
控制字符 |
作用 |
|
\\ |
输出\本身 |
|
\a |
输出警告音 |
|
\b |
退格键,即向左删除键 |
|
\c |
取消输出行末的换行符,与"-n"选项一致 |
|
\e |
ESCAPE键 |
|
\f |
换页符 |
|
\n |
换行符 |
|
\r |
回车键 |
|
\t |
制表符,即Tab键 |
|
\v |
垂直制表符 |
|
\0nnn |
按照八进制ASCII码表输出字符,其中0为数字0,nnn是三位八进制数 |
|
\xhh |
按照十六进制ASCII码表输出子非鱼,其中hh是两位十六进制数 |
例:删除左侧字符:
[root@localhost ~]# echo -e "abcd\be"
abce
制表符与换行符:
[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
十六进制ASCII码输出:
[root@localhost ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
a b c
d e f
输出颜色:
[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"
abcd
其中,"\e[1"表示开启颜色输出,"\e[0m"表示结束颜色输出。
30m=黑色 31m=红色 32m=绿色 33m=黄色
34m=蓝色 35m=洋红 36m=青色 37m=白色
2)第一个脚本,其中第一行为shell标志,表示以下写的程序为shell脚本程序,后续的#表示注释
[root@localhost ~]# vi hello.h
#!/bin/bash
#Description: The first program
#Autor: ws
#Date:
echo "hello world"
3)脚本执行
①通过Bash调用执行脚本
[root@localhost ~]# bash hello.h
hello world
②赋予执行权限,直接运行(习惯的执行方式)
[root@localhost ~]# chmod 755 hello.h
[root@localhost ~]# ./hello.h
hello world
引申:Linux的回车符用"$"表示,可用过cat –A进行查看;windows的回车符在Linux中显示为"^M$",需使用dos2unix命令进行转换。
例:显示Linux文件中的回车符:
[root@localhost sh1]# cat -A hello.sh
cription: The first program $
$
#Autor: ws$
$
#Date: $
$
$
$
echo "hello world"$
3 Bash的基本功能
(1)历史命令与命令补全
1)历史命令history,其格式为:
history [选项] [历史命令保存文件]
其中,-c选项表示清空历史命令(一般不建议),-w表示把缓存中的历史命令写入命令缓存文件~/.bash_history中。
history命令默认保存1000条记录,可以在环境变量配置文件/etc/profile中进行更改,所在位置为:HISTSIZE=1000。
历史命令的调用方式有:
①使用上下箭头调用
②使用"!n"执行第n条历史命令
③使用"!!"重复执行上一条命令
④使用"!字串"重复执行最后一条以该字串开头的命令
2)在Bash中,命令与文件补全可通过"Tab"键来完成。
(2)命令别名与常用快捷键
1)命令别名
设定命令别名的格式为:alias 别名="原命令"
查询命令别名的方式为:alias
使用别名时注意命令的执行顺序:
①第一顺位为用绝对路径或相对路径执行的命令;
②第二顺位为执行别名;
③第三顺位为执行Bash的内部自带命令;
④第四顺位为执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
可通过$PATH来查看系统的环境变量:
[root@localhost ~]# $PATH
-bash: /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
注意:命令行定义的别名是临时的,如需永久生效,则在家目录的.bashrc中写入别名即可,如root下的别名文件:
[root@localhost ~]# vim /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
~
删除别名的命令为:unalias 别名。
2)Bash常用快捷键
|
快捷键 |
作用 |
|
Ctrl+A |
将光标移动到命令行开头,如果输入的命令过长,想要把光标移动到命令行开头时使用 |
|
Ctrl+E |
将光标移动到命令行结尾 |
|
Ctrl+C |
强制终止当前的命令 |
|
Ctrl+L |
清屏,相当于clear命令 |
|
Ctrl+U |
删除或剪切光标之前的命令。输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键更加方便 |
|
Ctrl+K |
删除或剪切光标之后的内容 |
|
Ctrl+Y |
粘贴Ctrl+U或Ctrl+K剪切的内容 |
|
Ctrl+R |
在历史命令中搜索,按下该快捷键后会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索 |
|
Ctrl+D |
退出当前终端 |
|
Ctrl+Z |
暂停,并放入后台,该快捷键牵扯工作管理的内容 |
|
Ctrl+S |
暂停屏幕输出 |
|
Ctrl+Q |
恢复屏幕输出 |
(3)输入输出重定向
1)标准输入输出
|
设备 |
设备文件名 |
文件描述符 |
类型 |
|
键盘 |
/dev/stdin |
0 |
标准输入 |
|
显示器 |
/dev/stdout |
1 |
标准输出 |
|
显示器 |
/dev/stderr |
2 |
标准错误输出 |
2)输出重定向
|
类型 |
符号 |
作用 |
|
标准输出重定向 |
命令 > 文件 |
以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 |
|
命令 >> 文件 |
以追加的方式,把命令的正确输出输出到指定的文件或设备当中 |
|
|
标准错误输出重定向 |
错误命令 2> 文件 |
以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
|
错误命令 2>> 文件 |
以追加的方式,把命令的错误输出输出到指定的文件或设备当中 |
|
|
正确输出和错误输出同时保存 |
命令 > 文件 2>&1 |
以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
|
命令 >> 文件 2>&1 |
以追加的方式,把正确输出和错误输出都保存到同一个文件当中 |
|
|
命令 &> 文件 |
以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
|
|
命令 &>> 文件 |
以追加的方式,把正确输出和错误输出都保存到同一个文件当中 |
|
|
命令 >> 文件1 2>> 文件2 |
把正确输出追加到文件1中,把错误输出追加到文件2中 |
例1:向test1文件中写入ls命令 的输出:
[root@localhost ~]# ls > test1
[root@localhost ~]# cat test1
anaconda-ks.cfg
hello.h
install.log
install.log.syslog
ntfs-3g_ntfsprogs-2014.2.15.tgz
test1
testfile
例2:将date命令的输出追加到test1中:
[root@localhost ~]# date >> test1
[root@localhost ~]# cat test1
anaconda-ks.cfg
hello.h
install.log
install.log.syslog
ntfs-3g_ntfsprogs-2014.2.15.tgz
test1
testfile
2015年 02月 21日 星期六 04:29:05 CST
例3:将错误输出写入test2文件中:
[root@localhost ~]# lis 2>> test2
[root@localhost ~]# lst >> test2 2>&1
[root@localhost ~]# date &>> test2
[root@localhost ~]# cat test2
-bash: lis: command not found
-bash: lst: command not found
2015年 02月 21日 星期六 04:37:31 CST
注:一般将不需要的输出直接丢进垃圾箱中,其相应的命令为:ls &> /dev/null
3)输入重定向
wc命令为统计命令,其格式为:
wc [选项] [文件名]
其中,-c选项表示统计字节数,-w选项表示统计单词数,-l选项表示统计行数
输入重定向一般的格式为:命令 < 文件,表示将文件作为命令输入,如:
[root@localhost ~]# wc < anaconda-ks.cfg
54 124 1272
(4)多命令顺序执行与管道符
1)多命令执行顺序
|
多命令执行符 |
格式 |
作用 |
|
; |
命令1;命令2 |
多个命令顺序执行,命令之间没有任何逻辑联系 |
|
&& |
命令1&&命令2 |
逻辑与,当命令1正确执行,则命令2才会执行,当命令1执行不正确,则命令2不会执行 |
|
|| |
命令1||命令2 |
逻辑或,当命令1执行不正确,则命令2才会执行,当命令1正确执行,则命令2不会执行 |
例:
[root@localhost ~]# ls;date;cd /usr/;pwd
anaconda-ks.cfg install.log ntfs-3g_ntfsprogs-2014.2.15.tgz test2
hello.h install.log.syslog test1 testfile
2015年 02月 21日 星期六 04:51:56 CST
/usr
dd命令用于磁盘复制或数据复制,其格式为:
dd if=输入文件 of=输出文件 bs=字节数 count=个数
其中,if=输入文件指定源文件或源设备,of=输出文件指定目标文件或目标设备,bs=字节数表示一次输入/输出多少个字节,即这些字节看作数据块,count=个数表示输入/输出多少个数据块
例:向/root/testfile文件中写入/dev/zero的内容,共写入10M,同时显示存取时间:
[root@localhost usr]# date;dd if=/dev/zero of=/root/testfile bs=1k count=10000;date
2015年 02月 21日 星期六 05:01:43 CST
记录了10000+0 的读入
记录了10000+0 的写出
10240000字节(10 MB)已复制,1.29893 秒,7.9 MB/秒
2015年 02月 21日 星期六 05:01:44 CST
[root@localhost usr]# ll -h /root/testfile
-rw-r--r--. 1 root root 9.8M 2月 21 05:01 /root/testfile
注:判定一条命令是否正确执行,可以通过如下命令格式:
命令 && echo yes || echo no
2)管道符
管道符的命令格式为:
命令1 | 命令2
表示命令1的正确输出作为命令2的操作对象
例:使用more命令显示/etc目录下文件的详细信息:
[root@localhost usr]# ll -a /etc/ | more
总用量 1796
drwxr-xr-x. 103 root root 12288 2月 21 03:59 .
dr-xr-xr-x. 26 root root 4096 2月 21 03:59 ..
drwxr-xr-x. 3 root root 4096 1月 7 22:12 abrt
drwxr-xr-x. 4 root root 4096 1月 7 22:22 acpi
-rw-r--r--. 1 root root 44 2月 17 20:44 adjtime
……
grep命令用于搜索,其命令格式为:
grep [选项] "搜索内容" 文件名
其中,-i选项表示忽略大小写,-n选项表示输出行号,-v选项表示反向查找,--color-auto选项表示搜索出的关键字用颜色显示。
(5)通配符与其他特殊符号
1)通配符
|
通配符 |
作用 |
|
? |
匹配一个任意字符 |
|
* |
匹配0个或任意多个字符,也就是匹配任何内容 |
|
[] |
匹配中括号中任意一个字符 |
|
[-] |
匹配中括号中任意一个字符,-表示一个范围,如[a-z]代表匹配一个小写字母 |
|
[^] |
逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表一个不是数字的字符 |
2)Bash中其他特殊符号
|
符号 |
作用 |
|
' ' |
单引号,在单引号中所有的特殊符号,如"$"和"`"(反引号)都没有特殊含义 |
|
" " |
双引号,在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,其特殊含义分别为"调用变量的值"、"引用命令"和"转义符" |
|
` ` |
反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,不过推荐使用$(),因为反引号容易看错 |
|
$() |
和反引号作用一样,用来引用系统命令 |
|
# |
在Shell脚本中,#开头的行代表注释 |
|
$ |
用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值 |
|
\ |
转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出$符号,而不当做变量引用 |
例:单引号与双引号:
[root@localhost usr]# name=ws
[root@localhost usr]# echo "$name"
ws
[root@localhost usr]# echo '$name'
$name
[root@localhost usr]# echo "$(date)"
2015年 02月 21日 星期六 05:29:24 CST
[root@localhost usr]# echo '$(date)'
$(date)
例:反引号:
[root@localhost usr]# abc=`date`
[root@localhost usr]# echo $abc
2015年 02月 21日 星期六 05:31:57 CST
[root@localhost usr]# abc=$(date)
[root@localhost usr]# echo "$abc"
2015年 02月 21日 星期六 05:32:28 CST
Linux学习笔记(15)shell基础之Bash基本功能的更多相关文章
- Linux学习笔记:Shell脚本学习
概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...
- Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
- Linux学习-->如何通过Shell脚本实现发送邮件通知功能?
1.安装和配置sendmail 不需要注册公网域名和MX记录(不需要架设公网邮件服务器),通过Linux系统自带的mail命令即可对公网邮箱发送邮件.不过mail命令是依赖sendmail的,所以我们 ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- linux笔记:shell基础和bash的基本功能
shell的优势:可以直接调用linux系统命令 shell脚本的基本写法:脚本名以.sh结尾程序的第一行为#!/bin/bash,告诉系统这是一个shell脚本以#作为注释shell脚本的执行方式: ...
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- #Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
- Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
- linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
随机推荐
- ffmpeg-20160517-git-bin-v2
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- 留只脚印(DP)
题目链接:http://codeforces.com/problemset/problem/698/A 很久很久没做咯~~~~ dp 是个很神奇的东西.... #include <iostrea ...
- uva 1584.Circular Sequence
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- ibatis中使用like模糊查询
select * from table1 where name like '%#name#%' 两种有效的方法: 1) 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入 ...
- IOS - 多态
1. 多态性 多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式.或者说相同的名字,不同的类.我们来看一个书上的示例: #import ...
- 如何获取Iframe的页面控件的值
有时候我们在页面需要使用iframe的方法来引用另一个页面,虽然个人建议不要使用iframe哈,但是有些时候是没得法了才使用的咯,那么在使用的过程中也会遇到某一些问题,我将自己遇到的问题记录下来方便以 ...
- 让chrome的控制台更高大上(装B用)
作为一名屌丝前端程序员,在装B的道路上是越走越远了!废话不多说,直接先上几张图:我的Element是这样的: 我的console是这个样子的: 我的Timeline是这个样子的: ---------- ...
- mysql 三个表连接查询
权限表(permission)10 字段名称 类型 约束 描述 authorityid integer Pk not null 权限流水号id PK userNameId int not nul ...
- hdu 1005
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 思路:找规律题 #include<stdio.h> main() { ]; int ...
- PHP中的常用魔术方法
魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct() 构造方法 __destruct( ...