【三分钟带你学shell】shell编程基础

shell编程基础

shell简介

  • 属性

shell是一个命令行解释器,建立了用户和操作系统之间的接口。当我们在命令行输入一个命令后,shell会对命令进行解释,调用相应的程序去执行。shell是一种编程语言,写shell脚本的方式实现,后缀名为“.sh”。

  • 常用shell

linux中 有许多类型的shell,常见的有两个:

bash(b shell),最初unix shell之一的增强版本;

tcsh(c shell),作为BSD UNIX系统一部分而开发的C Shell的增强版本。

二者区别:例如常见的设置环境变量bash中用的是export,tcsh用的是setenv家目录下的隐藏文件bash下是.bashrc文件,tch下是.cshrc文件。

.bashrc文件主要保存个人的一些个性化设置,如命令别名、路径等。它是一个隐藏文件,需要使用“ls -a”指令来查看。一般环境变量在这里进行配置,每次打开新的 终端时,都要读取这个文件。

.bash_history:记录之前输入的命令,可以使用cat .bash_hsitory进行查看。

使用ps命令可以查看使用的是bash还是tcsh:

root@Ubuntu_16666:~# ps
  PID TTY          TIME CMD
16466 pts/0    00:00:00 bash
16489 pts/0    00:00:00 ps

家目录,就是我们经常说的home目录:echo $HOME(显示home目录) cd ~(切换到home目录)

根目录:/;当前目录:.;上一级目录:…;

  • shell脚本概念和应用场景

将要执行的linux命令按顺序保存在一个文件中,可结合各种shell控制语句以完成复杂操作。

应用场景:

重复性操作(需要多次执行的相同动作)拷贝多个文件;

文件中文本替换(修改文件中的某些字符或数字);

批量处理(多条语句一起执行,执行完一个脚本,再执行另外一个);

自动化运维(终端起来后自动运行);

系统状态监控(内存使用情况等);

定时任务执行(定时清理空文件夹等);

命名规范和注释:一般情况下后缀是.sh的shell脚本,注释使用#。

  • shell脚本第一行#!

#!的名字叫Sha-Bang:Sha-Bang是Sharp和Bang的组合词,Sharp for #,Bang for !。

Sha-Bang(#!)不是注释,#!所在行是告知该脚本使用的是哪种命令解释器,并不是可有可无的。当然,有时不写#!就是使用默认的命令行解释器。

root@Ubuntu_16666:~# echo $SHELL
/bin/bash

编写规范:#!应该位于第一行,否则会被认为是注释,并采用默认的命令行解释器。

同一个脚本只有第一样的#!会生效,其余的会被当做注释。

shell常用命令

命令名字 作用 用法
cd 切换目录 cd /
cat 显示文本文件内容 cat test.log
pwd 查询并显示当前目录 pwd
ls 显示文件信息 可指定路径 ls -al
touch 创建一个新的空文件 touch newfile
cp 复制文件 cp …/111.log /etc
mv 更改文件(夹)名 mv 111.log 111.log.bak
echo 打印文本内容 echo “hello world.”
mkdir 创建目录 mkdir demo
rmdir 删除空目录 rmdir demo
rm 删除文件 rm 111.log
vi/vim 编辑文本文件 vi test.log
chmod 改变文件权限 chmod u+x run.sh
date 显示系统日期 date
scp 跨机器复制 scp src dst
hostname 显示主机名 hostname
man 查询命令帮助 man ls
reboot 重启机器 reboot
shutdown 关机 shutdown -r now
uname 显示系统信息 uname -a
more、less 分页显示文件 more filename
head、tail 显示一个文件的头或者尾 head file -n 10
  • 目录切换

cd命令(change directory),用于切换当前工作目录:

cd ~:切换到home目录;

cd …/:切换到上一级目录;

cd …/…/:切换到上上一级目录;

cd -:切换到上次使用的目录;

cd /root/etc:切换指定的绝对路径;

  • 打包、压缩命令

打包:指将多个文件或目录放在一起,形成一个总的包,便于保存和传输,大小是没有变化的(即没有进行压缩)。

压缩:指将一个或多个文件通过压缩算法使文件的体积变小以达到压缩的目的,可以节约存储空间。

tar:打包、压缩、解压命令,常见的tar包格式:tar.gz、tar.bz2、tar.xz

选项:

-c 创建压缩文件(create)

-t 列出打包文件的列表(list)

-x 提取文件(extract)

-v 列出执行过程(verbose)

-C 指定目录(change to directory)

-z 操作gzip文件

-j 操作bzip2的文件

-J 操作xz的文件

zip/unzip:package and compress(archive) files,需要安装zip和unzip程序。

选项:

-r : 递归压缩(recursive),压缩目录常用到;-d:从压缩文件中删除指定文件;

-q:安静压缩(quiet),压缩的时候不显示指令执行的过程;

-x:排除压缩(exclude),排除指定的列表文件;

gzip:compress or expand files,只能压缩文件,不能压缩目录,不保留原文件。解压用gzip -d或者gunzip,gzip压缩后的文件:*.gz

选项:

-c:compress,压缩,输出压缩内容到标准输出上,若想保存为文件,可以用重定向;

-d:decompress,解压缩 -v:verbose,输出详细信息;

-n:n取值1~9,1表示压缩最快,压缩比最差,值越大,压缩比越好,默认为6;

bzip2:格式是bz2;xz:格式是xz(unxz)

选项:

-k:(keep)保留源文件,而不会删除原始的文件

其他方法和gzip是一样的。压缩同一个文件,bzip2要比gzip使用更长的时间。

  • 查找命令解析

find:search for files in a directory hierarchy(在目录中搜索文件)

语法:find 起始目录 寻找条件 操作 (find . 0name test*)

说明:从指定的起始目录开始,递归地搜索其各个子目录,查找满足条件的文件并对之采取相关的操作。

locate:find files by name(根据名称搜索文件,在数据库中搜索)

语法:locate 文件名 locate reads one or more databases prepared by updatedb

updatedb - update a database for mlocate(/var/lib/mlocate/mlocate.db,默认每日会更新默认数据库)

说明:该命令比find的搜索速度快,它需要一个数据库,这个数据库由crontab程序来建立。

用法:-i不区分大小写 -n列举前n个匹配项目(locate -i mytest)

grep:globally search for a regular expression.(正则搜索行)

说明:使用正则表达式进行全局搜索,打印出匹配的行。

  • 文件处理命令解析

sed:steam editor,文本编辑器(替换、删除等操作)

用法:sed -i ’s/原字字符串/目的字符串‘ 文件(只替换每一行的第一个)

举例:sed -i ‘s/d/test’ test.txt; sed -i ‘s/d/test/g’ test.txt #进行全局替换

awk:强大的文本分析工具,awk ‘{print $1,$4}’ test.txt #打印出1、4项,默认按空格分隔

wc:word counts字数、行数等统计

wc -l fimename 统计行数(lines);

wc -w filename 统计单词个数(word);

wc -c filename 统计字符个数(character);

cut:对文本列进行操作

cut -b 1-32(取前32个bytes) cat foo.c|grep Version |cut -d “” -f 2(选择第二个fields)

  • 进程命令解析

ps:a snapshot of the current processes(当前进程快照)

选项:

-e:select all processes(等同于 -A) -f:full format listing -L:show threads

用法: ps -ef, ps -eLf, ps axu(BAD格式)

pstree:display a tree of processes(进程树)

选项:

-p:show pids(显示进程的pid) -u:show uid(显示进程的所属用户)

top:display Linux tasks(持续动态监听进程运行状态)

说明:top命令的输出内容是动态的,默认3秒刷新一次。

top -p pid,可以指定监听某一固定进程;

按q会退出top命令,按h或?可获取帮助信息。

  • 条件分支语句if

单分支语句

if 条件;then
语句1...
fi

双分支语句

if 条件;then
语句1...
else
语句2...
fi

多分支语句

if 条件1;then
语句1...
elif 条件2;then
语句2...
elif 条件3;then
语句3...
else
语句4...
fi
  • 文件表达式
if [-e file1] 如果文件存在(exist)
if [-f file1] 如果存在且是普通文件
if [-d dir] 如果dir目录存在
if [-s file] 如果文件file存在且非空(size)
if [-b file] 如果文件存在且是块(block)文件
if [-c file] 如果文件存在且是字符(character)文件
if [-r file] 如果文件存在且可读
if [-w file] 如果文件存在且可写
if [-x file] 如果文件存在且可执行
  • 整数、字符串比较

整数类型比较:

== #字符比较相等返回真
-eq #wqual等于,数值比较
-ne #not equal 不等于
-gt #greater than 大于
-lt #less than 小于
-ge #greater or equal 大于等于
-le #less or equal 小于等于

字符串类型比较:

[str1] #字符串str1不为空
[-n str1] #字符串str1的长度大于0
[-z str1] #字符串str1的长度等于0
[str1 == str2] #前后字符串相同Posix sh
[str1 != str2] #前后字符串相同
[str1 > str2] #str1字典排序在str2之后
[str1 < str2] #str1字典排序在str2之前

-eq不用于字符串比较,赋值直接用=。

  • shell脚本的执行有几种方法

法1:“./脚本文件路径” 比如“…/test.sh”

./就是说在当前的工作目录下执行test.sh(该法执行脚本文件时不会改变自身位置,必须拥有执行权限)

法2:以绝对路径的方式执行shell脚本

例如:

/usr/data/test.sh

法3:直接使用bash或sh来执行shell脚本

例如:

cd /usr/data
sh test.sh

此方法可不设定脚本的执行权限,也不用写#!,因为该方法将脚本作为参数传给sh(bash)命令来执行的。不是test.sh自己来执行,是被人家调用执行的,所以不需要执行权限。

方法4:在当前的shell环境中执行脚本

例如:

source test.sh
.test.sh

你可能感兴趣的:(技术,OS)