基础命令
主要的命令和快捷键
Linux系统命令由三部分组成:cmd + [options]+[operations]
查看和修改ip地址ifconfig和ifconfig eth0 +ip地址
cal日历
date时间date +%Y%m%d输出日期的数字格式,如20160420
bc计算器
who用户名字
whoami用户
lsb_release -a查看系统的版本号
uname -a查看系统的内核版本号
history历史命令记录
得到root权限su root
修改root密码sudo passwd root
关机poweroff或者shutdown now
man帮助命令
ls查看目录里面文件(或者用tree函数)
ls -al其中-l参数表示要求ls命令列出每个文件的详细信息,-a参数则要求ls命令还要同时列出隐藏文件,-i可以显示文件的inode即id。
关于ls -l结果解释:drwx-wx-wx,10个字符,第一个字符表示文件的类型,然后每三个字符一组,r代表可读取权限,w代表可写入权限,x代表可执行权限,若无权限则用-代替。2~4个字符代表该文件所有者user的权限,5~7个字符代表给文件所有组的权限,8~10个字符代表给其他用户(others)拥有的权限。
改变文件的权限:chmod
给某文件添加用户读权限:chmod u+r somefile
给某文件删除用户读权限:chmod u-r somefile
给某文件添加用户写权限:chmod u+w somefile
给某文件删除用户写权限:chmod u-w somefile
给某文件添加用户执行权限:chmod u+x somefile
给某文件删除用户执行权限:chmod u-x somefile
添加用户对某文件的读写执行权限:chmod u+rwx somefile
删除用户对某文件的读写执行权限:chmod u-rwx somefile
给某文件设定用户拥有读写执行权限:chmod u=rwx somefile
#若想给某文件加上可执行权限:chmod +x somefile
cd一键返回用户主目录
cd ~等同于cd命令
cd -返回上一次来源的目录
cd ..返回上级目录
pwd用户的当前目录
./用户的当前目录
../用户的父级目录
ctrl+u清空当前命令行中输入的命令
ctrl+shift++号使得teminal终端字体变大
ctrl++号使得teminal终端字体变小
shift+pageup\pagedown在命令行的终端进行翻页
exit退出命令行窗口
touch+文件名可以创建一个文件touch a.txt b.txt c.txt同时创建多个文件
rm+文件名可以删除文件rm a.txt b.txt c.txt同时删除多个文件
mkdir+目录名可以在当前目录下创建一个目录mkdir dir1 dir2 dir3 ...,同时创建多个子目录
mkdir -p a/b/c创建层级目录使用-p选项
rmdir+目录名删除空目录(此目录下无任何文件或目录) rmdir dir1 dir2 dir3同时删除多个子目录
通配符*匹配任意长度、任意字符
rm *.txt删除所有的txt文档rm e.*
强制删除非空的子目录: mkdir -p a/b/c/d/e rm -rf a
Linux系统中没有回收站,删除后不可逆
文件的拷贝cp cp src.c src.c.bak备份src.c为src.c.bak
cp src.c a/src.bak将文件src.c拷贝到a目录下并且修改名字为src.bak
cp src.c a/拷贝不修改名字
文件的移动mv可以实现文件或目录的移动或改名字
文件的重命名mv mv src.c.bak src.c修改名字mv a abc修改目录名字为abc
注:源和目标一般在同一级目录下是修改名字,在不同的目录下是进行移动
3个文本编辑器gedit\ed\nano
cat打印某目录下的某文件内容绝对路径打印cat /etc/apt/sources.list
gedit文本编辑器,类似于windows里面的txt文本,其中带有~号的文件为临时的存储文本
nano ctrl+o为保持,ctrl+x为退出
tac和cat命令差不多,主要为逆向打印
head默认为文件的前面十行参数为-n
tail默认为文件的尾部十行参数为-n
more对文件进行按百分比打印按空格键翻页
less
tar文件打包命令-c创建一个包-v现实包处理的过程-f必须,无任何含义
tar -cvf ab.tar aa.c shan.e创建一个包
tar -xvf ab.tar解压一个包
tar -tvf ab.tar查看一个包里面的内容
tar -xvf ab.tar shan.e只解压包里面的shan.e的文件
tar -xvf ab.tar -C kk/将解压包里面的文件解压到kk文件夹中
对文件进行压缩
gzip代码:gzip aa.tar压缩后aa.tar没了,得到aa.tar.gz
bzip2代码:bzip2 aa.tar得到aa.tar.bz2
tar代码:tar -zcvf ac.tar.gz aa.tar新建一个压缩包名字为ac.tar.gz
tar -jcvf aa.tar.bz2 ac.tar新建一个压缩包名字为aa.tar.bz2
解压命令
gunzip代码:gunzip aa.tar.gz
bunzip2 bunzip2 aa.tar.bz2
tar tar -zxvf aa.tar.gz tar -jxvf aa.tar.bz2 tar -ztvf aa.tar.bz2
其中-zxvf为tar命令解压.gz文件-jxvf为tar命令解压bz2文件
注:gzip和bzip2以及tar不能通过同样的后缀名进行解压,必须是经过相同的压缩方式得到的压缩包,每种压缩的算法不一样.
which可以定位可执行文件所在目录which ls which pwd
whereis命令定位文件所在目录1.二进制的-b 2.源文件-s 3.帮助文档-m
locate基于数据库通过名字查找文件最新的文件可能查不到,需要手动更新数据库,用命令sudo updatedb更新数据库无论当前目录在哪里都可以查找文件或者文件夹locate aa.tar
file查看文件的类型
find通过文件名查找文件find+查找目录+查找内容
find PATH -name FILENAME
find ./ -name 'a*'在当前目录下查找以a为开头的文件
find ~/ -name 'a*'在用户主目录下查找以a为开头的文件
三种方式安装软件
1.源代码安装
2.包安装.deb包dpkg -i xxx.deb sudo dpkg -i包名字
.rpm包rpm -i xxx.rpm sudo rpm -i包名字
3.apt在线安装sudo apt-get install aptitude -y安装aptitude软件
服务器有?sudo aptitude search软件名
本机安装过?sudo aptitude show软件名
本机安装?sudo aptitude install软件名
卸载软件?sudo aptitude remove软件名
重新安装?sudo aptitude reinstall软件名
安装tree软件(一款树状结构显示文件夹内容的软件)安装sudo aptitude install tree
sources.list里面记录aptitude可以访问apt服务器地址
sudo aptitude update更新sources.list
关于sources.list的更多源,百度搜索ubuntu 15.10 source.list cn99 lup
软/硬链接
软链接类似windows的快捷方式删除了主文件快捷方式无用了软链接文件->文件名->磁盘存储区域
ln -s源文件名生成软链接名ln -s /etc/apt x将路径名字赋给x
硬链接多个文件名对应同一区域磁盘扇区块相当于复制cp
硬链接有两个限制,1.不允许给目录创建链接2.不同分区上的两个文件之间不能建立硬链接
ln源文件名生成硬链接文件名
vim编辑器
vi testvi编辑文件
按i可进入vim的编辑模式
按o键进入下一行
写完了按ESC键
k键向上,j键向下,h键向左,l键向右
Ubuntu自带版本的vi编辑器为vim-tiny缺少左右光标键和语法高亮的设置
安装完整版的vim编辑器sudo aptitude install vim安装完成
刚刚进入vi,vi处于一般操作模式,不可写入文字,只能进行一些操作,称为操作模式
在操作模式下可以进行1)移动光标2)拷贝、删除、粘贴
按下字母i进入编辑模式,i在光标前插入字符,a在光标后插入字符按字母o键切换到下一行
k键向上,j键向下,h键向左,l键向右
保存文档,按ESC退回操作模式,再按冒号,进入末行命令模式
w为保存,q为退出,q!为舍弃,
gcc -o app ***.c
./app执行C语言文件
vim编辑器文件另存为:首先需要按ESC键回到命令模式;然后输入命令:w filename,文件不存在会自动新建文件。用法示例:另存为文件为zhidao.txt :w zhidao.txt文件默认保存在当前工作路径。
同一文件内文本复制与粘贴的操作
在操作模式下,按o为光标下一行插入一行,按shift+o为向上插入一行;
按yy为复制光标所在的行,按nyy为光标所在行起复制n行;
按dd为剪切光标所在的行,按ndd为光标所在行起剪切n行;
按p为光标所在行下面粘贴,按shift+p为光标所在行上面粘贴;
vi编辑器中,操作模式时按v键进入反选模式,从当前光标进入反选,然后对选中的文字进行操作。
在操作模式下,按x为删除字符;
在操作模式下,按r,为替换模式,替换某个字符;
set nu为显示行号
set nonu为不显示行号;
syntax on为显示语法高亮;
syntax off为关闭语法高亮;
多个文本之间的内容拷贝
一、在末行命令中打入e +另一个文件名编辑文件,然后用nyy命令进行拷贝,然后在切换,用p命令
二、在末行命令中打入sp+另一个文件名进入分屏,然后利用yy和p命令进行拷贝和粘贴,ctrl+ww为两个窗口光标切换
三、在末行命令中打入vsp+另一个文件名进入分屏,然后利用yy和p命令进行拷贝和粘贴,ctrl+ww为两个窗口光标切换
末行命令:wqall为全部存盘退出
vim编辑器中的查找
在操作模式中打入/+需要搜索的内容,按n可以切换下一个,N切换上一个
在帮助手册manul中/+搜索的内容
/为从当前光标向后搜索,?是从当前光标先前搜索;
vim编辑器中的替换
在操作模式下打入:起点,终点s/被替换的字符串/替换成的字符串/g
其中起点和终点是行号
例如:2,9s/int/float/g
全文替换为%s/float/int/g
按u是撤销操作
%s/float/int/gc对每一个需要替换的字符都要进行确认;
管道函数
Linux中管道函数用|来连接两个命令,它可以把一个命令的输出内容当做下一个命令的输入内容,两个命令之间只需要使用管道符连接即可。
grep
grep [ivnc] '需要匹配的字符'文件名
-i不区分大小写
-c统计包含匹配的行数
-n输出行号
-v反向匹配,不包含含有匹配字符的行
grep函数默认区分大小写,如需要忽略大小写,选项-i
sort
sort [-ntkr]文件名
-n采取数字排序
-t指定分隔符
-k指定第几列
-r反向排序
对输出内容直接排序时,默认按照每行的第一个字母进行排序
例子:cat sort.txt | sort -r,按照第一列进行排序
cat sort.txt | sort -t ":" -k 2按照第二列进行排序,用:分隔符分裂,但是按照名字排序
cat sort.txt | sort -rnt ":" -k 2
按照第二列数字大小进行逆向排序,分隔符为":"
sort -t ":" -k 2 -n sort.txt
uniq
删除重复内容
uniq [-ic]
-i忽略大小写
-c计算重复行数
注意:uniq一般和sort的连用,因为uniq只会比较相邻的行,所以必须先排序然后再删除重复的行
例如:sort -n uniq.txt | uniq -c
cut
使用cut截取文本
cut -f指定的列-d "分隔符"
例如:cut -f1,6-7 -d':'
想要打印每行第1-5个字符,以及7-10个字符,使用命令:
cut -c1-5,7-10 passwd
tr
做文本转换
主要作用在于文本转换或者删除
-c用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d删除字符串1中所有输入字符。
-s删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
例如,将小写字母转换为大写字母命令:cat passwd | tr '[a-z]' '[A-Z]'
删除冒号命令,使用:
cat passwd | tr -d ':'
将文件file中出现的"abc"替换为"xyz"
cat file | tr "abc" "xyz" > new_file
把文件中的数字0-9替换为a-j
# cat file | tr [0-9] [a-j] > new_file
paste
函数用于连接两个文件
paste a.txt b.txt
-d指定在合并文件时行间的分隔符
实现文本合并cat a.txt b.txt >new
split
分割文件
#按照行进行分割,-l参数制定每500行为一个小文件
split -l 500 big_file.txt small_file_
#分割完成后,当前目录下会生成很多小文件
如果文件是二进制的,则只能按照文件大小分割
ll –h big_bin
split –b 64m big_bin small_bin
echo命令
echo为打印某条指令
正则化表达式与通配符
"."符号
点符号用于匹配除换行符之外的任意一个字符。例如,r.t可以匹配rot,rut,但是不能匹配root。
例:grep 'r..t' /etc/passwd
"*"符号
"*"符号用于匹配前一个字符0次或者任意多次,比如ab*,可以匹配a、b、abb等。"*"号经常和"."号一起使用,比如”.*”代表任意长度的不包含换行的字符。
例如:”r.*t”代表查找包含字母r,后面紧跟任意长度的字符,再跟一个字母t的行。
“\{n,m\}”符号
虽然”*”可用于重复匹配前一个字符,但却不能精确的控制匹配的重复次数,使用“\{n,m\}”符号则能达到要求。
“\{n\}”符号匹配前面的字符n次,“\{n,\}”匹配前面的字符至少n次以上(含n次)。
“\{n,m\}”匹配前面的字符n到m次。
“^”符号
这个符号用于匹配开头字符的行
例如:grep ‘^root’ /etc/passwd
“$”符号
用于匹配结尾字符的行
例如:grep ‘^r.*h$’ /etc/passwd
符号“^$”则代表改行为空
“[ ]”符号
用于匹配方括号内出现的任一字符。用符号“-”作限定
例如:[A-Za-z]匹配所有的字母,[^A-D]代表取反即除了字母A-D以外的字母,例如:“^1[38][0-9]\{9\}”代表手机号码
“\”符号
为转义符。比如[ \- ]此时”\-”代表“-”,再如想打入一个点,则\.*代表匹配任意长度的点号。
“\<”符号和“\>”
这两个符号分别用于界定单词的左边界和右边界。
比如“\”则用于匹配以”hello”结尾的单词。
“\<\>”则用于精确匹配任意一个字符串。
例如:grep “\”
\n为换行符,\r为一个回车符,\t为一个制表符,\f为一个换页符,\s为任何空白字符,\S为任何非空白字符。
扩展的正则表达式
在使用这些扩展符号前需要使用命令egrep。
“?”符号
“?”符号用于匹配前一个字符0次或1次,所以”ro?t”仅能匹配rot或者rt.
“+”符号
“+”符号用于匹配前一个字符1次以上,所以”ro+t”就可以匹配rot、root.
“|”符号
“|”符号是”或”的意思,即多种可能的罗列
例如:^0[0-9]\{2\}-[0-9]\{8\} | ^0[0-9]\{3\}-[0-9]\{8\}
“|”符号
“()”符号通常和”|”符号连用,用于枚举一系列可替换的字符。
例如021-88888888和0511 88888888可以使用代码:^0[0-9]\{2,3\}(-| )[0-9]\{8\}
再如:h(ar|oo|ol)d可以匹配hard, hold或hood
特殊的POSIX字符,示例如下:
grep支持一类特殊的POSIX字符:
[:alnum:]文字数字字符
[:alpha:]文字字符
[:digit:]数字字符
[:graph:]非空字符(非空格、控制字符)
[:lower:]小写字符
[:cntrl:]控制字符
[:print:]非空字符(包括空格)
[:punct:]标点符号
[:space:]所有空白字符(新行,空格,制表符)
[:upper:]大写字符
[:xdigit:]十六进制数字(0-9,a-f,A-F)
例如:搜索以数字开头的行:grep ^[[:digit:]] zzbds.txt
注意:需要多加上一层中括号
通配符
“*”符号
“*”符号代表0个或多个字符。比如*.doc代表所有以.doc结尾的文件。A*.doc代表以字母A开头的doc文件。
“?”符号
“?”符号代表的是任意的一个字符,例如A?.doc代表的是以字母A开头,文件名第二个字母为任意字母的doc文件。
“{}”符号
可以匹配所有括号内包含的以逗号隔开的字符。
例如:ls –l {A,B,C}.doc和命令ls –l [A-C].doc列出所有以字母A,B,C开头.doc结尾的文件
嵌套功能:ls –l {[A-Z]*.doc,[0-9]??.txt}
“^”符号和“!”符号
这两个符号往往和”[]”一起使用,当出现在”[]”中的时候,代表取反。
文本处理工具sed
sed处理文本时是以行为单位的,每处理完一行就立即打印出来,然后再处理下一行,直至全文处理结束。sed可做的编辑动作包括删除、查找替换、添加、插入、从其他文件中读入数据等。
sed命令使用的场景包括以下:
常规编辑器编辑困难的文本。
太过于庞大的文本,使用常规编辑器难以胜任(比如vi一个几百兆的文件)
有规律的修改文本,加快文本的处理速度
sed修改文件流的方式如下:sed [options] ‘command’ file
# ‘command’命令均为vi编辑器中的命令
# sed命令默认不修改原文件,如果希望保存修改后的文件则需要用重定向’>’
#使用-e参数和分号连接多编辑命令
例如:sed –e ‘s/this/That/g’ –e ‘s/line/LINE/g’ sed.txt或者sed ‘s/this/That/g’ ; ‘s/line/LINE/g’ sed.txt
删除
sed ‘1d’ sed.txt >save.txt #删除第一行
sed ‘1,3d’ sed.txt #删除1到3行
sed ‘1,$d’ sed.txt #删除1到最后一行
sed ‘$d’ sed.txt #删除最后一行
sed ‘5!d’ sed.txt #只保留第五行
sed ‘/Empty/d’ sed.txt #删除所有包含Empty的行
sed ‘/^$/d’ sed.txt #删除空行
查找替换
使用s命令可将查找到的匹配文本内容替换为新的文本。
sed ‘s/line/LINE/’ sed.txt #将line替换为LINE,每行默认替换一个
sed ‘s/line/LINE/2’ sed.txt #将line替换为LINE,每行默认替换两个
sed ‘s/line/LINE/g’ sed.txt #将line替换为LINE,全部替换
sed ‘s/^this/That/’ sed.txt #只替换开头的this为That
#命令中间不能有空格
字符转换
使用y命令可进行字符转换,其作用为将一系列字符逐个的变换为另外一系列字符,基本用法如下:
sed ‘y/OLD/NEW/’ file #将全文中字母O替换为N,字母L替换为E,字母D替换为W.
插入文本
使用i或者a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入.
sed ‘2 i Insert’ sed.txt #在第二行之前插入文本
sed ‘2 a Insert’ sed.txt #在第二行之后插入文本
sed ‘/Second/ i \Insert’ #在匹配行之前插入文本
读入文本
使用命令r可以从其他文件中读取文本,并插入匹配行之后.
sed ‘/^$/r /etc/passwd’ sed.txt #将/etc/passwd中的内容读取到sed.txt空行之后
打印
使用p命令可进行打印,这里使用sed命令时一定要加参数-n,表示不打印没关系的行。
例:sed –n ‘1p’ sed.txt #只打印第一行
#sed实际处理了第二行,其他几行由于没有匹配所以并未真正处理。
再如:sed –n ‘s/the/THE/gp’ sed.txt #只打印实际处理过的行,简化了输出,第二行the全部转换为THE
写文件
sed本身默认并不改写原文件,而只是对缓冲区的文本做了修改并输出到屏幕。所以想保存文件,除了使用重定向或-i,还可以使用w命令将结果保存到外部指定文件。
例如:sed –n ‘1,2 w output’ sed.txt #这里没有任何的输出,因为输出被重定向到文件output
#将sed.txt文件中1,2行写入文件output中
sed脚本
将动作静态化的写到某个文件中,然后调用sed命令并使用-f参数指定该文件。
vi sed.rules
s/this/THAT/g
/^$/d
sed sed.rules sed.txt
高级替换
替换匹配行的下一行,使用n命令
例如:sed ‘/^${n;s/line/LINE/g}’ sed.txt
文本处理工具awk
awk是基于列的处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,“空白字符”包括空格、tab、连续的空格和tab等。每个非空白的部分叫做域,从左到右依次是第一个域,第二个域。$1,$2表示第一域第二个域,$0表示全部域。
打印指定的域
#打印第一个和第四个列awk ‘{print $1,$4}’ awk.txt
#打印全部内容awk ‘{print $0}’ awk.txt
指定打印的分隔符
默认情况下awk是使用空白字符作为分隔符的,但是也可以通过-F参数指定分隔符来区分不同的域(类似于cut命令).
注意:必须得使用单引号不能使用双引号.
例如:awk –F’.’ ‘{print $1,$2}’ awk.txt
打印每行的列数内部变量NF参数
awk ‘{print NF}’ awk.txt #打印每行的列数,指定不同的分隔符会有不同结果
打印固定域
在NF前加上$符号,则代表最后一列,这样不管有多少列,只要使用$NF就能打印出最后一行。倒数第二行为$(NF-1)
例如:awk ‘{print $NF}’ awk.txt awk ‘{print $(NF-1)}’ awk.txt
截取字符串
使用substr函数对指定域截取字符串
substr(指定域,第一个开始字符的位置,第二个结束的位置)
#其中第二个结束的位置可以为空,这样默认输出到该域的最后一个字符
例如:cat awk.txt | awk ‘{print substr($1,6,2)}’ #输出第一个域从第六个字符开始长度为2的字段
内部变量length
使用内部变量length可以确定字符串的长度
例如:cat awk.txt | awk ‘{print length}’
使用awk求列和
例如: cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total}’ #求年龄的和
cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}’ #求年龄的平均值
NR为内部变量,表示已经读取的记录数
Shell编程
第一个例子:
vi HelloWorld.sh
输入:#!/bin/bash
#this is a comment
echo ‘HelloWorld!’
:wq保存退出
运行:在当前目录下bash HelloWorld.sh
或者改变文件的执行权限,chmod +x HelloWorld,然后打入./HelloWorld运行
Shell的内建命令
1.如何确定内建命令:type
判断一个命令是否是内建命令使用type函数
例如:type cd
:cd is a Shell builtin
2.执行程序:”.”
使用点号执行没有加权限的脚本可以正常运行
. ./HelloWorld.sh #两个点之间需要加一个空格,否则../代表当前目录的上一层目录
3.别名alias
alias可用于创建命令的别名,若直接输入该命令且不带任何参数,则列出当前用户使用了别名的命令。
创建命令的别名如下:
alias myShutdown =’shutdown –h now’
该命令只能在当前的Shell环境有效,重新登录则消失。可将该条目写到用户目录的.bashrc文件中
4.删除别名:unalias
unalias ll
5.任务前后台切换:bg,fg,jobs
6.改变目录:cd
7.声明变量declare,typeset
8.打印字符:echo
echo用于打印字符,典型用法是使用echo命令并跟上使用双引括号的内容,-n命令可以使得不打印换行符。
9.跳出循环break
10.控制循环:continue
13.退出shell:exit
14.环境变量声明export
例如:export var=1
16.整数运算:let
17.当前目录显示:pwd
18.声明局部变量:local
19.从标准输入读取一行到变量:read
20.定义函数返回值:return
21.向左移动位置函数:shift
变量赋值和取值
变量名=变量名
注意1:变量名和变量名之间用等号紧紧相连,之间没有任何的空格
注意2:当变量中有空格时必须用引号括起,否则会出现错误
变量的取值只需要在变量前加上$符号即可,严谨的写法是${}
注意3:当变量值引用的是其他变量,则必须使用双引号,因为单引号会阻止shell解释特殊字符$,例如john=1;name=”$john”,echo $name结果为1
取消变量unset
例如:name=john; echo $name ;unset name注意:unset+变量名不需要$符号
取消函数:
unset_funciont(){echo “Hello World!”
}
unset unset_function
特殊参数
位置参数:脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。当参数大于9时,需要用括号${}将其括起来标识;$#表示脚本参数的个数总和,$@或者$*表示脚本的所有参数。$?永远是上一个命令的返回值。
数组
数组的定义:declare –a Array; Array[0]=0;Array[1]=1;Array[2]=”HelloWorld”
数组还可以在创建的同时赋值declare –a Name=(‘john’ ‘sue’);Name[2]=’Wang’
或者直接不使用declare关键字:Name=(‘john’ ‘sue’)
注意:输入数据时候一定要用空格将其分开,逗号不行。
还可以给特定的元素赋值。Score=([3]=3 [5]=5 [7]=7)
数组操作:
1.最简单的操作就是数组取值,其格式为:${数组名[索引]}
例如:echo ${Array[0]}
指定索引只能列举单个元素,要是想一次性取出所有元素的值,可以采取两种方式:
echo ${Array[@]}或者echo${Array[*]}
注意:echo ${Array[@]}得到的是以空格隔开的元素值,而echo ${Array[*]}得到的是一整个字符串。
2.数组的长度,即元素的个数
利用@或者*字符,可以将数组扩展成列表,然后使用#号来获取数组元素的个数。
例如:echo ${#Array[@]}或者echo ${#Array[*]}
3.数组截取:可以截取某个元素的一部分,对象可以是真个数组或者某个元素。
#取出数组的第一、二个元素
echo ${Array[@]:1:2}
#取出第二个元素从0个字符开始连续5个字符
echo ${Array[2]:0:5}
4.连接数组:将若干个数组进行拼接操作
Conn=(${Array[@]} ${Name[@]})
5.替换元素:将数组内某个元素的值替换成其他值。
${数组名[@或#]/查找字符/替换字符}
Array=(${Array[*]/HelloWorld/HelloJohn})
echo ${Array[*]}
6.取消数组或者元素:和取消变量一样,取消一个数组的方式也是用unset命令。
unset Array[1] #取消第二个元素
unset Array #取消数组
只读变量
只读变量又称为常量,是通过readonly内建命令创建的变量。这种变量在声明时候就要求赋值,并且之后无法更改,这和之前讲到的使用declare –r声明只读变量的效果是一样的。
# readonly RO=100
RO=200 #会报错
转义符和引用
shell中的转义符是反斜线”\”,使用转义符的目的是使转义符后面的字符单纯的作为字符出现。
例如,想要打印字符$Array,使用命令echo $Array,由于变量Array并未赋值,故打印的是空的,此处应该加上转义符,即echo \$Array,结果显示$Array
常见的特殊符号
引用
引用是指将字符串用某种括号括起来,以防止特殊字符被解析为其他意思。
1.部分引用
部分引用是指用双引号括起来的引用。在这种引用方式中,$符号、`引号,转义符(\)这三种特殊字符依然会被解析为特殊的意义。
例如:var=”A B C”
如果输入echo $var,则输出的内容只保留了每个字母间一个空格
如果想要完全的按照格式保留原来的变量,打入echo “$var”
2.全引用
全引用是指用单引号括起来的引用。单引号中的任何字符都只当做是普通字符(除了单引号本身,也就是说单引号中间无法在包含单引号,即便转义符转义单引号也不行)。
例如:echo ‘$var’如果想输出变量$var,则需要使用双引号。
命令替换
命令替换是指将命令的标准输出作为值赋给某个变量。
使用的方式有两种。
1.使用反引号` , `命令`
2.使用$(),$(命令)
注意:如果被引用的命令输出的内容包括多行,此时若不通过双引号引用的方式输出变量,则输出的内容中将会删除换行符,文件名之间会使用系统默认的空来填充,即输出的内容只占一行。
例如:var=$(ls -l); echo $var; echo “$var”
运算符
shell中的运算符主要有比较运算符(用于整数比较)、字符串运算符(用于字符串测试)、文件操作运算符(用于文件测试)、逻辑运算符、算数运算符、位运算符、自增自减少运算符。
使用$[]做运算
x=1;y=2;echo $[x+y];
使用bc做运算
在Linux下使用bc的最简单的方式是直接输入命令bc。
#bc默认情况下并不显示小数部分,需要设置显示的小数位数,scale=3设置为三位小数输出。
比较运算:2>1 2<1 1==1 1&&2 1&&0 1||0 1||2 !0
例如:希望一次性处理多个计算
cat cal.bc
12*34;34/12;scale=3;34/12;a=1;b=2;a+b
cat cal.bc | bc
echo ‘scale=100;sqrt(3)’ |bc
有时候需要在shell程序里面直接调用bc计算表达式,并将结果复制给变量以参与后面的计算或者判断。这里给出了一个求和的例子:
#!/bin/bash
num1=10
num2=15
total=$(echo “num1+num2”|bc)
echo $total
shell中的特殊字符
通配符
常见的通配符有*、?和[]括起来的字符序列。
引号
引号包括单引号和双引号,单引号又叫做“全引用”或“强引用”;双引号又称为“部分引用”或者“弱引用”,所有用双引号括起来的字符除了美元符号、反斜线、反引号依然保留用途外,其他的字符都作为普通字符处理;而所有的单引号括起来的部分都作为普通字符处理,但是要注意单引号中间不能再出现单引号,否则shell会无法判别到底哪里是单引号的气质位置。
注释符
shell使用#作为注释符。但是如果#号后面出现!,则不会作为注释符。
反引号
反引号用于命令替换,和$()的作用相同,表示返回当前命令的执行结果并赋值给变量。
测试和判断
使用$?来进行判断。
判断为真则返回0,为假则返回非0。
测试结构
第一种方式:test expression
第二种方式:使用[ expression ],[]中间有两个空格
判断一个文件是否存在,例如:
test –e /var/messages
echo $?
字符串测试
shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试。
字符串测试
说明
-z “string”
字符串string为空时返回真,否则为假
-n “string”
字符串string非空时返回真,否则为假
“string1”=” string2”
字符串string1和string2相同时返回为真,否则为假
“string1”!=” string2”
字符串string1和string2不同时返回为真,否则为假
“string1”>” string2”
按照字典排序,字符串string1排在string2之前返回为真,否则为假
“string1”<” string2”
按照字典排序,字符串string1排在string2之后返回为真,否则为假
例如:str1=”” str2=”hello” test –z “$str1” [ “$str1”=”$str2” ] [ “$str1”\>”$str2” ]
如果不想使用转义符,则可以使用[[]]括起来表达式
整数比较
比较两个整数的大小关系
测试成立返回0,否则则返回非0数值。
测试方法一:test “num1” num_operator “num2”
测试方法二:[ “num1” num_operator “num2” ]
其中num_operator是整数测试符常见的整数测试符如下:
整数比较
说明
“num1” –eq “num2”
如果两个值相等则返回真,否则返回假。equal
“num1” –gt “num2”
如果大于则返回真,否则返回假。great than
“num1” –lt “num2”
如果小于则返回真,否则返回假。less than
“num1” –ge “num2”
如果大于等于则返回真,否则返回假。great equal
“num1” –le “num2”
如果小于等于则返回真,否则为假。less equal
“num1” –ne “num2”
如果不等于返回真,否则返回假。not equal
逻辑测试符和逻辑运算符
逻辑测试用于连接多个测试文件,并返回整个表达式。逻辑测试主要有逻辑非、逻辑与、逻辑或三种。
逻辑测试表如下:
逻辑运算
说明
!expression
如果expression为真,则测试结果为假
expression1 –a expression2
expression1和expression2同时为真,则测试结果为真,否则为假
expression1 –o expression2
expression1和expression2只要有一个为真,则结果为真,同时都假则结果为假
[! –e /var/log/messages]和[-e /var/log/messages01]
[! –e /var/log/messages –a –e /var/log/messages01]
或者采用以下的写法:
! [ -e /var/log/messages ] && [ -e /var/log/messages01 ] #记得加上空格
if判断结构
语法结构如下:
if expression; then
command
fi
如果expression测试返回真,则执行command。如果要执行的不止一条命令,则不同命令用换行符隔开,如下所示:
if expression;then
command1
command2
…
fi
例子:
#!/bin/bash
echo -n "Please input a score:"
read SCORE
if [ "$SCORE" -lt 60 ];then
echo "C"
fi
if [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ];then
echo "B"
fi
if [ "$SCORE" -ge 80 ];then
echo "A"
fi
if/else判断结构
if/else判断结构语法结构:
if expression;
then command
else command
fi
#!/bin/bash
#读两个数,判断这两个数是否相等
read x y
if [ $x -eq $y ];
then echo "$x=$y"
else echo "$x!=$y"
fi
#多层嵌套
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
else if [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else if [“$SCORE” –ge 80 ];then
echo “A”
fi
fi
fi
换种写法
#!/bin//bash
echo –n “Please input a score:”
read SCORE
if [ “$SCORE” –lt 60 ];then
echo “C”
elif [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then
echo “B”
else [“$SCORE” –ge 80 ];then
echo “A”
fi
case判断结构
用case来做多分支的结构语法结构如下:
case VAR in
var1) command1 ;;
var2) command2 ;;
var3) command3 ;;
…
*) command;;
esac
其原理为从上到下依次比较VAR和var1\var2\var3的值是否相等,如果匹配相等则执行后面的命令语句,在无一匹配的情况下匹配最后默认的*,并执行后面的默认命令。要注意的是,case判断结构中的var1\var2\var3等这些值只能是常量或正则表达式。
循环
for循环语法结构
for var in (list)
do
command
done
#这里的列表是一系列以空格分隔的值。shell每次从这个列表中取出一个值,然后运行do/done之间的命令,直到取完列表中的所有的值。
#!/bin/bash
for I in 1 2 3 4 5 6 7 8 9
do
echo $i
done
注意:for循环里面可以in (list)也可以in ${数组[*]},之前可以先定义一个列表变量或者数组变量。
#!/bin/bash
fruits=”apple orange banana pear” #此处也可以定义为fruits=(apple orange banana pear)
for fruit in ${fruits} #此处应该改为for fruit in ${fruits[*]}
do
echo “$fruit is John’s favourite”
done
echo “No more fruits”
seq命令用于产生一个整数数列。seq 5 = 1 2 3 4 5
默认从1开始,步长为1
格式为:seq起始数字步长结束数字
例子:
#!/bin/bash
sum=0
x=$(seq 1 2 100)
for i in ${x}
do
let “sum+=i”#或者代码sum=$[sum+i]或者sum=$((sum+i))
done
echo $sum
类C的for循环
shell支持类C的for循环,具体结构为:
for((i=1;i<=10;i++))
do
echo –n “$i” #此处echo加上选项-n是不换行打印
done
echo
while循环
while循环的语法结构为:
while expression
do
command
done
首先while将测试expression的返回值,如果返回值为真则执行循环体,返回值为假则不执行循环。循环完后进入下一次循环之前再次测试。
#!/bin/bash
count=5
while [ $count –gt 0 ]
do
echo –en “$count\n”
let count=count-1
done
#注意:echo打印函数默认是每行打印一个元素,-n选项使得不换行,-e选项激活转义符\
#注意:[]和[[]]的区别在于[]中间使用-a –o这种逻辑符号,而[[]]则使用&& ||这种逻辑连接符号
#注意:运算符号有三种let expression、$[expression]、$((expression))
echo $?就是输出上次脚本的退出码。如果是0说明上次脚本执行成功,如果非0说明上次脚本执行失败。
例子
#!/bin/bash
sum1=0
sum2=0
i=1
while [ $i -le 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
使用while按行读取文件
cat student.txt
john 30 boy
sue 28 girl
wang 25 boy
xu 23 girl
#!/bin/bash
while read LINE
do
NAME=`echo $LINE |awk '{print $1}'`
AGE=`echo $LINE |awk '{print $2}'`
SEX=`echo $LINE |awk '{print $3}'`
echo "My name is $NAME ,I'm $AGE years old ,I'm a $SEX ."
done < student.txt
until循环
until循环的语法结构为:
until expression
do
command
done
例子
#!/bin/bash
sum1=0
sum2=0
i=1
until [ $i -gt 100 ]
do
let sum1=sum1+i
if [[ $(($i%2)) -ne 0 ]];then
let sum2=sum2+i
fi
let i=i+1
done
echo -en "sum1=$sum1\nsum2=$sum2\n"
函数
shell中函数的语法结构为:
function FUNCTION_NAME( ){
command1
command2
…
}
#打印Hello的例子
#!/bin/bash
function sayHello(){
echo “Hello”
}
echo “Call function sayHello”
sayHello
#判断文件是否存在在例子
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
带参数的函数
#!/bin/bash
FILE=/etc/notExistFile
function checkFileExist(){
if [ -f $FILE ];then
return 0
else
return 1
fi
}
echo “Call function checkFileExist”
checkFileExist $1
if [ $? –eq 0 ];then
echo “$FILE exist”
else
echo “$FILE not exist”
fi
#执行脚本时候,输入bash checkFileExist.sh /etc/passwd后面加上参数
下面是接受两个参数的例子:
#!/bin/bash
function power(){
x=1
y=0
if [[ $2 –gt $y ]];then
for((i=1;i<=2;i++))
do
let “x=x*$1”
done
fi
echo $x
}
power $1 $2
#运行bash power.sh 2 2