Linux命令基础入门

Linux命令基础入门

这是作者自己为了 Linux期末考试做的知识简介,虽然很简单但是作为Linux入门或者查询手册都是还不错的资料(自认为)。里面有很多资料来自于csdn或者其他地方,如果涉及到侵权,请第一时间私信,我会在看到之后的第一时间删除掉相关部分。

1. Linux命令合集

1.1 目录操作

pwd				查看当前工作目录
clear 			清除屏幕
cd ~			当前用户目录
cd /			根目录
cd -			上一次访问的目录
cd ..			上一级目录

查看目录信息

ll				查看当前目录下内容(LL的小写),列表查看,显示更多信息
ls				查看当前目录下的所有目录和文件
ls-a			查看当前目录下的所有目录和文件(包括隐藏文件)
ls/dir		查看指定目录/dir下的所有目录和文件

创建目录

mkdir aaa		在当前目录下创建aaa目录,相对路径;
mkdir ./bbb		在当前目录下创建bbb目录,相对路径;
mkdir /ccc		在根目录下创建ccc目录,绝对路径;

递归创建目录

mkdir -p temp/nginx 

搜索命令

find / -name 'b'		查询根目录下(包括子目录),名以b的目录和文件;
find / -name 'b*'		查询根目录下(包括子目录),名以b开头的目录和文件; 

重命名

mv 原先目录 文件的名称   mv tomcat001 tomcat 

剪切命令

mv	/aaa /bbb			将根目录下的aaa目录,移动到bbb目录下,在bbb,麚也叫aaa目录;
mv	bbbb usr/bbb			将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为bbb;
mv	bbb usr/aaa			将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为aaa;

拷贝

cp -r 目录名称 目录拷贝的目标位置   -r代表递归
cp /usr/tmp/aaa  /usr		将/usr/tmp目录下的aaa目录复制到 /usr目录下面
cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不    用写-r递归

删除

rm [rf] 目录

删除文件

rm 文件        删除当前目录下的文件
rm -f 文件    删除当前目录的的文件(不询问)

删除目录

rm -r aaa    递归删除当前目录下的aaa目录
rm -rf aaa    递归删除当前目录下的aaa目录(不询问)

全部删除

rm -rf *    将当前目录下的所有目录和文件全部删除
rm -rf /*    【自杀命令!慎用!慎用!慎用!】将根目录下的所有文件全部删除

强制删除指定目录

rm -rf /bbb			强制删除/目录下的bbb目录。如果bbb目录中还有子目录,也会被强制删除,不会提示;

1.2 文件操作

删除文件

rm -r a.java		删除当前目录下的a.java文件(每次回询问是否删除y:同意)

强制删除文件

rm -rf a.java		强制删除当前目录下的a.java文件
rm -rf ./a*			强制删除当前目录下以a开头的所有文件;
rm -rf ./*			强制删除当前目录下所有文件(慎用);

创建文件

touch testFile

递归删除.pyc格式的文件

find . -name '*.pyc' -exec rm -rf {} \;

打印当前文件夹下指定大小的文件

find . -name "*" -size 145800c -print

递归删除指定大小的文件(145800)

find . -name "*" -size 145800c -exec rm -rf {} \;

递归删除指定大小的文件,并打印出来

find . -name "*" -size 145800c -print -exec rm -rf {} \;

“.” 表示从当前目录开始递归查找
“ -name ‘*.exe’ "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件
" -type f "查找的类型为文件
“-print” 输出查找的文件目录名
-size 145800c 指定文件的大小
-exec rm -rf {} ; 递归删除(前面查询出来的结果)

find命令实例

find . -name "*.log" -ls  在当前目录查找以.log结尾的文件,并显示详细信息。 
find /root/ -perm 600   查找/root/目录下权限为600的文件 
find . -type f -name "*.log"  查找当目录,以.log结尾的普通文件 
find . -type d | sort   查找当前所有目录并排序 
find . -size +100M  查找当前目录大于100M的文件

whereis 命令:whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。

whereis ls    将和ls文件相关的文件都查找出来

which 命令:which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

which pwd  查找pwd命令所在路径 
which java  查找path中java的路径 

1.3 文件内容操作(vim)

修改文件内容vim

vim a.java   	进入一般模式
i(按键)   		进入插入模式(编辑模式)
ESC(按键)  		退出
:wq 			保存退出(shift+:调起输入框)
:q!			不保存退出(shift+:调起输入框)(内容更改)
:q				不保存退出(shift+:调起输入框)(没有内容更改)

文件内容的查看

cat a.java		查看a.java文件的最后一页内容;
more a.java		从第一页开始查看a.java文件内容,按回车键一行一行进行查看,
                    按空格键一页一页进行查看,q退出;
less a.java		从第一页开始查看a.java文件内容,按回车键一行一行的看,
                    按空格键一页一页的看,支持使用PageDown和PageUp翻页,q退出;

more 和 less的区别:

  1. less可以按键盘上下方向键显示上下内容,more不能通过上下方向键控制显示
  2. less不必读整个文件,加载速度会比more更快
  3. less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容.
  4. 由于more不能后退.

实时查看文件后几行(实时查看日志)

tail -f a.java			查看a.java文件的后10行内容;

前几行查看

head a.java				查看a.java文件的前10行内容;
tail -f a.java			查看a.java文件的后10行内容;
head -n 7 a.java		查看a.java文件的前7行内容;
tail -n 7 a.java		查看a.java文件的后7行内容;

文件内部搜索指定内容

grep under 123.txt			在123.txt文件中搜索under字符串,大小写敏感,显示行;
grep -n under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行及行号;
grep -v under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示没搜索到的行;
grep -i under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行;
grep -ni under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行及行号;

终止当前操作 ctrl+c ctrl+z 区别:

Ctrl+Z就扮演了类似的角色,将任务中断,但是任务并没有结束,在进程中只是维持挂起的状态,用户可以使用fg/bg操作前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行。
Ctrl+C也扮演类似的角色,强制中断程序的执行。

重定向功能
可以使用 > 或 < 将命令的输出的命令重定向到test.txt文件中(没有则创建一个)

echo 'Hello World' > /root/test.txt

1.4 系统日志位置

cat /etc/redhat-release		查看操作系统版本
/var/log/message			系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/message			系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 
/var/log/secure				与安全相关的日志信息 
/var/log/maillog			与邮件相关的日志信息 
/var/log/cron				与定时任务相关的日志信息 
/var/log/spooler			与UUCP和news设备相关的日志信息 
/var/log/boot.log			守护进程启动和停止相关的日志消息 

查看某文件下的用户操作日志
到达操作的目录下,执行下面的程序:

cat .bash_history

1.5 软连接

创建软连接

ln -s /usr/local/app /data

删除软连接

rm -rf /data

1.6 压缩和解压缩

1.6.1 tar

tar原理

压缩 -c

tar -cvf start.tar a.java b.java		//将当前目录下a.java、b.java打包
tar -cvf start.tar ./*					//将当前目录下的所欲文件打包压缩成haha.tar文件

tar -zcvf start.tar.gz a.java b.java	//将当前目录下a.java、b.java打包
tar -zcvf start.tar.gz ./*				//将当前目录下的所欲文件打包压缩成haha.tar.gz文件

解压缩 -x

tar -xvf start.tar						//解压start.tar压缩包,到当前文件夹下;
tar -xvf start.tar -C usr/local 		//(C为大写,中间无空格)
										//解压start.tar压缩包,到/usr/local目录下;

tar -zxvf start.tar.gz					//解压start.tar.gz压缩包,到当前文件夹下;
tar -zxvf start.tar.gz -C usr/local 	//(C为大写,中间无空格)
										//解压start.tar.gz压缩包,到/usr/local目录下;

解压缩 tar.xz 文件

tar xf node-v12.18.1-linux-x64.tar.xz
1.6.2 unzip/zip

压缩 zip

zip lib.zip tomcat.jar							//将单个文件压缩(lib.zip)
zip -r lib.zip lib/								//将目录进行压缩(lib.zip)
zip -r lib.zip tomcat-embed.jar xml-aps.jar		//将多个文件压缩为zip文件(lib.zip)	

解压缩 unzip

unzip file1.zip  								//解压一个zip格式压缩包
unzip -d /usr/app/com.lydms.english.zip			//将`english.zip`包,解压到指定目录下`/usr/app/`

1.7 Linux下文件的详细信息

 R:Read  w:write  x: execute执行
-rw-r--r-- 1 root root  34942 Jan 19  2018 bootstrap.jar
前三位代表当前用户对文件权限:可以读/可以写/不能执行
中间三位代表当前组的其他用户对当前文件的操作权限:可以读/不能写/不能执行
后三位其他用户对当前文件权限:可以读/不能写/不能执行

文件详细信息

更改文件权限

chmod u+x web.xml (---x------)		为文件拥有者(user)添加执行权限;
chmod g+x web.xml (------x---)		为文件拥有者所在组(group)添加执行权限;
chmod 111 web.xml  (---x--x--x)	为所有用户分类,添加可执行权限;
chmod 222 web.xml (--w--w--w-)		为所有用户分类,添加可写入权限;	
chmod 444 web.xml (-r--r--r--)		为所有用户分类,添加可读取权限;

1.8 Docker常用命令

下载镜像

wget https://mirrors.huaweicloud.com/elasticsearch/7.8.0/elasticsearch-7.8.0-windows-x86_64.zip

常用命令

#1、查看docker中下载好的镜像:
docker images
 #2、查询需要的容器名称:
docker search mysql
#3、将需要的docker容器下载运行到本地(名称、端口号、msyql密码、ID):
docker run -di --name=first -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root 26d26dsfsd31a
#4、查看运行的docker容器:
docker ps
#5、查看所有的docker容器(包括未运行的):
docker ps -a
#6、停止当前运行的docker容器:
docker stop first
#7、启动docker容器:
docker start first
#8、重启docker容器:
docker restart first
#9、删除docker容器:
docker rm first

1.9 运维常用命令

1、查看服务器是否可用

ping 49.32.587.164

2、查看服务器端口是否可用

telnet 49.32.587.164 8093

3、关机: shutdown

立即关机: poweroff

-h:停止系统服务并关机  
-r: 停止系统服务后重启  
shutdown -h now  --立即关机  
shutdown -h 10:53  --到10:53关机,如果该时间小于当前时间,则到隔天  
shutdown -h +10  --10分钟后自动关机  
shutdown -r now  --立即重启  
shutdown -r +30 'The System Will Reboot in 30 Mins'   --30分钟后重启并并发送通知给其它在线用户  
reboot 立即重启

4、查看处于各种连接状态数量(ESTABLISHED、CLOSE_WAIT、TIME_WAIT)

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

查看处于ESTABLISHED状态连接

netstat -nt | awk '{if($NF=="ESTABLISHED"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'

查看处于CLOSE_WAIT状态连接

netstat -nt | awk '{if($NF=="CLOSE_WAIT"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'

查看处于TIME_WAIT状态连接

netstat -nt | awk '{if($NF=="TIME_WAIT"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'

5、 ping 命令

ping -c 4 www.baidu.com

6、 netstat 用于显示各种网络信息,如网络连接、路由表,接口信息等

列出所有处于监听状态的tcp端口:

netstat -lt

查看所有的端口信息, 包括 PID 和进程名称

netstat -tulpn

7、查看端口号占用情况

lsof -i:8080  #用于查看某一端口的占用情况
netstat -tunlp #显示tcp,udp的端口和进程等相关情况
netstat -tunlp|grep 8080 #指定端口号的进程情况

8、查看PID进程信息

ps -aux |grep 28990 #查看PID进程信息
jstack 2246|grep '0x9eb' -A 50 #根据PID,查看JVM中各线程信息('0x9eb’为nid值)

9、ps命令

ps aux | grep 'ssh' #过滤得到当前系统中的 ssh 进程信息

10、管道命令

Linux 中管道的作用是将上一个命令的输出作为下一个命令的输入, 像 pipe 一样将各个命令串联起来执行, 管道的操作符是 |

ps -ef|grep java #管道命令查看当前运行的程序中,名称为java的程序
cat /etc/passwd | grep 'root' #查看/etc/passwd文件中的root内容

查看当前系统的ip连接(Windows和Linux通用)

netstat -an 

11、帮助命令

--help man

shutdown --help
ifconfig --help
man shutdown 打开说明书之后用q退出

1.10 yum常用命令

yum install iptables-services		下载并安装iptables
yum list					列出当前系统中安装的所有包
yum search package_name		在rpm仓库中搜寻软件包
yum update package_name.rpm		更新当前系统中所有安装的rpm包
yum update package_name		更新一个rpm包
yum remove package_name		删除一个rpm包
yum clean all				删除所有缓存的包和头文件

1.11 用户权限操作

1. 添加用户

添加用户sum:

useradd –d /usr/sum -m sum

关于useradd的某些参数:

-u: 指定 UID,这个 UID 必须是大于等于500,并没有其他用户占用的 UID

-g: 指定默认组,可以是 GID 或者 GROUPNAME,同样也必须真实存在

-G: 指定额外组

-c: 指定用户的注释信息

-d: 指定用户的家目录

已创建的用户sum设置密码

passwd sum

用户添加root权限

visudo

找到root用户权限位置

添加与root用户相同权限

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
eses    ALL=(ALL)       ALL

查看新建用户

cat /etc/passwd

删除用户sum

userdel sum

删除用户文件夹

rm -rf /usr/sum

切换下刚添加的用户

su sum

回到root用户

exit
2. 添加组

添加用户组

groupadd groupname

删除用户组

groupdel groupname

可以看到自己的分组和分组id

cat /etc/group

1.12 其他命令

1、查看历史使用命令

history

2、过滤与es相关命令

history | grep es

3、查看占用资源

ps -au		占用的资源是从进程启动开始,计算的平均占用资源,比如cpu等
top			实时占用的资源;

4、查看当前目录所占存储

du -lh			查看当前文件下各文件夹占用存储空间
du -sh			查看当前文件夹所占存储空间
du --max-depth=<目录层数> 	超过指定层数的目录后,予以忽略。
du --max-depth=1 			只查看当前目录下文件占用的存储空间

5、管道命令:

根据项目查看进程,更加PID查看项目,以及项目路径

ps -ef 						查看所有的进程
ps -ef | grep mysql			查看mysql相关的进程
ps -ef | grep sshd  查找指定ssh服务进程 
ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp身 
ps -ef | grep sshd -c 查找指定进程个数 

6、通过进程PID查看所占用的端口号

netstat -nap |grep 进程ID(PID)

7、查看Linux下系统存储使用率

df -h			查看系统硬盘使用情况

8、杀死进程(根据PID)

kill -9 2630		进程pid

8、关闭防火墙

service iptables stop      临时关闭防火墙
chkconfig iptables off     防火墙开启不启动
service iptables status    查看防火墙状态

9、开机启动选项

msconfig					查看开机启动选项
chkconfig					查看开机启动服务列表

10、查看MySQL服务的程序的状态

service mysql start        开启MySQL    
service mysql status       查看MySQL的状态    
service mysql stop         关闭MySQL    

2. vim操作

打开文件

命令:vi 文件名
示例:打开当前目录下的aa.txt文件 vi aa.txt 或者 vim aa.txt

注意:使用vi编辑器打开文件后,并不能编辑,因为此时处于命令模式,点击键盘i/a/o进入编辑模式。

编辑文件

使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。

i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入

保存或者取消编辑

保存文件:

第一步:ESC 进入命令行模式
第二步:: 进入底行模式
第三步:wq 保存并退出编辑

取消编辑:

第一步:ESC 进入命令行模式
第二步:: 进入底行模式
第三步:q! 撤销本次修改并退出编辑

【vi编辑器的3种模式】
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

1. 命令行模式command mode)

控制屏幕光标的移动,字符、字或行的删除,查找,移动复制某区段及进入Insert mode下,或者到 last line mode。
命令行模式下的常用命令:

  1. 移动光标

    • 控制光标移动:↑,↓,j

    • 移动光标到首行或末行(!)

      移动光标到首行 => gg

      移动光标到末行 => G

    • 翻屏

      向上 翻屏,按键:ctrl + b (before) 或 PgUp

      向下 翻屏,按键:ctrl + f (after) 或 PgDn

      向上翻半屏,按键:ctrl + u (up)

      向下翻半屏,按键:ctrl + d (down)

    • 快速定位光标到指定行(!)

      行号 + G,如150G代表快速移动光标到第150行。

  2. 复制/粘贴

    • 复制当前行(光标所在那一行)

      按键:yy

      粘贴:在想要粘贴的地方按下p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用P键

    • 从当前行开始复制指定的行数,如复制5行,5yy

      粘贴:在想要粘贴的地方按下p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用P键

  3. 剪切/删除,剪切与删除都是dd

    • 剪切/删除当前光标所在行

      按键:dd (删除之后下一行上移)

      粘贴:p

    • 剪切/删除多行(从当前光标所在行开始计算)

      按键:数字dd

      粘贴:p

    • 剪切/删除光标所在的当前行(光标所在位置)之后的内容,但是删除之后下一行不上移

      按键:D (删除之后当前行会变成空白行)

  4. 撤销/恢复

    • 撤销:u(undo)

      恢复:ctrl + r 恢复(取消)之前的撤销操作【重做,redo】

2. 编辑模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
编辑模式下常用命令:

  1. ESC 退出编辑模式到命令行模式;

3. 底行模式(last line mode)

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
底行模式下常用命令:

  1. 保存/退出

    • :w => 代表对当前文件进行保存操作,但是其保存完成后,并没有退出这个文件
    • :q => 代表退出当前正在编辑的文件,但是一定要注意,文件必须先保存,然后才能退出
    • :wq => 代表文件先保存后退出(保存并退出)如果一个文件在编辑时没有名字,则可以使用:wq 文件名称,代表把当前正在编辑的文件保存到指定的名称中,然后退出
    • :q! => 代表强制退出但是文件未保存(不建议使用)
  2. 查找/搜索

    • 切换到命令模式,然后输入斜杠/(也是进入末行模式的方式之一)

      进入到末行模式后,输入要查找或搜索的关键词,然后回车

      如果在一个文件中,存在多个满足条件的结果。在搜索结果中切换上/下一个结果:N/n (大写N代表上一个结果,小写n代表next)

      如果需要取消高亮,则需要在末行模式中输入:noh【no highlight】

  3. 文件内容的替换

    • 首先要进入末行模式(在命令模式下输入冒号:)

    • 根据需求替换内容

      只替换光标所在这一行的第一个满足条件的结果(只能替换1次)

      :s/要替换的关键词/替换后的关键词   +  回车
      切换光标到hello  rhel这一行
      :s/rhel/rhel8
      

      替换光标所在这一行中的所有满足条件的结果(替换多次,只能替换一行)

      :s/要替换的关键词/替换后的关键词/g		g=global全局替换
      把hello rhel中的所有rhel都替换为rhel8,切换光标到hello rhel这一行
      :s/rhel/rhel8/g
      

      针对整个文档中的所有行进行替换,只替换每一行中满足条件的第一个结果

      :%s/要替换的关键词/替换后的关键词
      把每一行中的第一个hello关键词都替换为hi
      :%s/hello/hi
      

      针对整个文档中的所有关键词进行替换(只要满足条件就进行替换操作)

      :%s/要替换的关键词/替换后的关键词/g
      替换整个文档中的hello关键词为hi
      :%s/hello/hi/g
      
  4. 显示行号

    :set nu
    【nu = number】,行号
    取消行号 => :set nonu
    

3. shell编程

shell编程原文连接

3.1 shell简介

3.1.1 运行shell脚本

shell脚本test.sh

#!/bin/bash
echo "Hello World"
1. 作为可执行程序运行
chmod +x test.sh	# 赋予可执行权限
./test.sh		    # 执行程序
2. 作为解释器参数运行
/bin/sh test.sh		# 执行命令
/bin/php test.php	# 执行命令
3.1.2 shell注释

单行注释 #

# 这是一个注释
# author:ohuohuoo
# date:`date`

多行注释

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

# EOF可以换成其他符号
:<<E!
注释内容...
注释内容...
注释内容...
!
3.1.3 shell编写的基本步骤
  1. 建立shell文件
  2. 赋予shell文件可执行程序权限(使用chmod命令修改权限)
  3. 执行shell文件(直接运行赋予权限后的二进制文件)

3.2 shell变量

3.2.1 定义变量

shell编程中,定义变量是直接定义的,没有明确的数据类型,shel允许用户建立变量存储数据,但是将认为赋给变量的值都解释为一串字符,如下

cout=1			# 定义变量		
name="ohuohuo"	 # 定义变量
echo $cout		 # 取变量值
echo $name	     # 取变量值

shell变量命名规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

在变量中使用系统命令,需要加上 " `"符号(ESC键下方),如下所示

DATE1=`date`	
DATE2=$(date)
3.2.2 使用变量

使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下

name="test_name"
echo "My name is ${name}and you?"

已经定义过的变量,可以二次定义并重新被赋值覆盖上一次的变量值

3.2.3 变量类型

运行shell时会同时存在三种变量

局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量

环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量

shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,不同类型的变量保证了shell的正常运行

3.2.4 变量操作

shell中的变量,默认为可读可写类型,如果想要其只可读,如同url一样,需要将其声明为只读类型变量(如同const),使用readonly命令,如下脚本

#!/bin/bash
Url="http://www.baidu.com"
readonly Url

如果想要删除变量,使用unset命令解除命令赋值,但是unset不能删除可读变量,如下所示

#!/bin/sh
name="ohuohuo"
Url="http://www.baidu.com"
readonly Url	# 设置可读变量
unset name		# 可以被删除
unset Url		# 不可被删除
echo $name		# 不被打印出
echo $Url		# 打印出

3.3 shell字符串

3.3.1 字符串类型

在shell中字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

使用单引号

str='this is a string'

使用单引号的不足:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

使用双引号

name="ohouhuoo"
str="please input your \"$name"\"
echo -e $str

使用双引号的优势:

  • 可以在双引号中使用变量
  • 可以在双引号中使用转移字符

由此可见,双引号较单引号而言有更强大的优势

3.3.2 字符串操作

提取子字符串:使用字符串的截取命令,用于提取部分字符串

string="this is a test"
echo ${string:2:6} # 表示从第3个字符开始截取

上式输出结果为is is

查找字符串:用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找itit两个字符,t先出现,输出为1

string="this is a test"
echo `expr index "$string" it`  # 输出 1

3.4 shell数组

在bash下,仅仅支持一维数组,并且没有限定数组的大小,不支持多维数组。类似于 C 语言,数组元素的下标由 0 开始编号(上述字符串也是这样)。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

3.4.1 定义数组
# 一般定义
array_name=(value1 value2 value3 value4)

# 多级定义
array_test=(
value1 
value2 
value3 
value4
)

# 
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
... 
...

三种定义形式均可

3.4.2 数组操作

读取数组:和读取变量名相同,使用$符号,需要加上下标名

valuen=${array_name[n]}
echo ${array_name[@]} # 读取所有

获取数组长度:获取数组长度的方法与获取字符串长度的方法相同,如所示

# 取得数组元素的个数
length=${#array_name[@]}	# 从头到尾取
# 或者
length=${#array_name[*]}	# 取所有
# 取得数组单个元素的长度
lengthn=${#array_name[n]}	# 取特定

3.5 shell传递参数

在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……,脚本编写如下,保存为test.sh

echo "传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

执行脚本如下

chmod +x test.sh
./test.sh 1 2 3

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKgaHcec-1641109840561)(/Users/uru/Library/Application Support/typora-user-images/image-20211212155901369.png)]

在使用shell传递参数的时候,常常需要用到以下的几个字符来处理参数

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。 如 的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如"∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “2 " … " 2" … “2”…"n” 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

example

echo "传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uv0noiVs-1641109840562)(/Users/uru/Library/Application Support/typora-user-images/image-20211212160807835.png)]

​ 其实就是一个输出参数的过程

3.6 shell运算符

3.6.1 shell运算符种类
  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 逻辑运算符
  • 字符串运算符
  • 文件测试运算符

shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种

  • awk
  • expr(使用频繁)

运算规则注意点

  • 表达式和运算符之间必须要有空格,例如 3+2 是不对的,必须写成 3 + 2
  • 完整的表达式要被 两个" ` "包含(在 Esc 键下边那个键)

实例

#!/bin/bash

val=`expr 3 + 2`
echo "两数之和为 : $val"
3.6.2 算数运算符

shell支持的常用的如下表,举例中这里假定变量 a 为 10,变量 b 为 20

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。
3.6.3 关系运算符

shell中的关系运算符和其他编程语言不同,shell中使用特殊的字符表示关系运算符,并且只支持数字,不支持字符串,除非字符串是数字,下表为常用关系运算符,同样指定a为10,b为20

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[$a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

Example

#!/bin/bash

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi 

需要注意的点:

运算符和数之间必须要用空格隔开

3.6.4 布尔运算符

shell中的布尔运算符使用如下表,同样指定a为10,b为20

运算符说明举例
!非运算,表达式为true则返回false,否则返回true[ ! false ] 返回 true
-o或运算,有一个表达式为true则返回true[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为true才返回true[ $a -lt 20 -a $b -gt 100 ] 返回 false

Example

#!/bin/bash

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi 

3.6.5 逻辑运算符
运算符说明举例
&&逻辑的AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的OR[[$a -lt 100 || $b -gt 100]]返回true

example

#!/bin/bash

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi 

需要注意的点:

这里使用两层的[ ]符号,将两次关系运算的结果保存在条件句中

3.6.6 字符串运算符

shell中常用的字符串运算符如下表。假定变量 a 为 “abc”,变量 b 为 “efg”

运算符说明举例
=检测两个字符串是否相等,相等返回true[ $a = $b ] 返回 false
!=检测两个字符串是否相等,不相等返回true[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回true[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回true[ -n “$a” ] 返回 true
$检测字符串是否为空,不为空返回true[ $a ] 返回 true

Example

#!/bin/bash

a="abc"
b="efg"

if [ $a != $b ]
then
   echo "$a != $b : a 等于 b"
else
   echo "$a != $b: a 不等于 b"
fi 
3.6.7 文件测试运算符

shell中的文件测试运算符用于检测在类unix系统中,文件的各种属性,如下表

运算符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true[ -w $file ] 返回 true
-x file检测文件是否可执行,如果是,则返回 true[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true[ -e $file ] 返回 true。

example

#!/bin/bash

file="/var/www/test/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi    

3.7 shell编程中的命令

3.7.1 echo命令

echo命令在shell中用于字符串的输出,调用的格式:

echo string

echo命令还可显示复杂的输出格式

显示普通的字符串

echo "this is a test"

显示转义字符

echo "\this is a test\"

显示变量

name="ohuohuo"
echo "you name is $name"

显示换行

echo -e "Right!\n " # -e 表示开启转义
echo "this is other line"

显示结果定向重定向至文件

echo "this is a test" > testfile

显示command命令执行结果

echo `date`
3.7.2 printf命令

shell中的printf命令如同C语言中一样,调用格式也大抵相同,只是有一点点不同。与echo命令打印字符串不同的是,printf不会自动调价换行符号,可以手动添加

printf命令的语法:

printf format-string [arguments...]

参数说明:

  • format-string:格式控制字符串
  • arguments:参数列表

举例如下

$ echo "Hello, Shell"	# 输入
Hello, Shell		   # 输出
$ printf "Hello, Shell\n" # 输入
Hello, Shell			# 输出

printf命令可以较为强大的使用转义字符,shell中常用的转义字符如下表示所示

序列说明
\a警告字符,通常为ASCII的BEL字符
\b后退
\c抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f换页(formfeed)
\n换行
\r回车(Carriage return)
\t水平制表符
\v垂直制表符
\一个字面上的反斜杠字符
\ddd表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd表示1到3位的八进制值字符
3.7.4 test命令

shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

数值测试命令表

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真

example

#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串测试表

参数说明
=等于则为真
!=不相等则为真
-z 字符串字符串长度为0则为真
-n 字符串字符串长度不为0则为真

example

# !/bin/bas
num1="name"
num2="function"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

文件测试表

参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

example

# !/bin/bash
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

3.8 shell流程控制

shell中的流程控制主要由条件、循环组成

3.8.1 if- else条件控制语句

if - then - fi

调用格式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

# 写成单行
if condition;then command1; command2;fi

如果存在不满足的条件的情况

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

在多层嵌套条件情况

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

example

num1=$[6]
num2=$[8]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi
3.8.2 case条件

shell中case语句为多功能选择语句,与其他语言相通的是,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句调用格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

需要注意的点:

  • 取值后面需要加上in
  • 每一模式必须以右括号结束
  • 每个模式结束后使用;;符号结尾
  • 如果没有找到对应的模式。以*结尾,并跳出case
  • case需要搭配esac结尾,与C语言中的switch … case语句类似

example

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

case中想要跳出循环有两个命令:break和continue

break命令允许跳出所有循环(终止执行后面的所有循环)

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

3.8.3 for循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

# 写成一行同样使用分号将语句分开 
  • in列表中可以包含替换、字符串和文件名等
  • in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数

example

for num in 1 2 3 4 5
do
    echo "The value is: $num"
done
3.8.4 while循环
while condition
do
    command
done

example

#!/bin/bash
num=1
while(( $num<=5 ))
do
    echo $num
    let "num++"
done

3.9 shell函数

3.9.1 定义函数

linux中的shell同样可以定义函数,然后在函数中调用执行相关的shell命令,完成功能,shell中的函数调用格式如下:

[ function ] funname [()]
{
    action;
    [return int;]
}

参数说明:

  1. function fun () 表示有返回参数的函数(如同C语言中的有返回类型的函数(int,char等))
  2. fun() 表示无返回参数的函数(类似于C语言中的void类型函数)
  3. 使用return可以返回参数值(一般为数值n),如果不使用,将默认以最后一条命令运行的结果作为返回值

example

#!/bin/bash

FunReturn(){
    echo "两个数字进行相加运算..."
    echo "输入第一个数字: "
    read num
    echo "输入第二个数字: "
    read anothernum
    echo "两个数字分别为 $num 和 $anothernum !"
    return $(($num+$anothernum))	# 分别返回数值
}
FunReturn		# 调用函数
echo "输入的两个数字之和为 $? !" # 使用通配符获取上一条指令的返回值

所有的函数在使用前必须定义,这是因为shell解释器是顺序逐层执行的,当shell解释器发现定义的函数时,才会找到其对应的功能,进而执行

3.9.2 参数定义

此外想要使用shell函数传递参数时,需要在函数体的内部,通过 $n 的形式来获取参数的值,与其他语言不同的是,这不是在定义函数的时候就给定参数,而是在函数体中获取到的参数,例如,$1表示第一个参数,$2表示第二个参数,参数调用列表如下

参数处理说明
$#传递到脚本或者函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行时的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是加引号,并在引号中返回每个参数
$-显示shell使用的当前选项,与set命令功能相同
$?显示最后命令退出的状态。0表示没有错误,其他任何之表明错误

shell编程实例

来自实验报告五

if分支

1、 判断输入文件的属性

#!/bin/bash
clear
echo "input a file or directory name ,pls"
read path_name
if [ -d $path_name ] ##after [ should have space and before ] should have space 
then
	echo " $path_name is a directory"
elif [ -f $path_name ]
then
	echo "$path_name is a regular file"
	if [ -r $path_name ]
	then
		echo "$path_name is a readable file"
	fi
	if [ -w $path_name ]
	then
		echo " $path_name is a writeable file"
	fi
	if [ -x $path_name ]
	then
		echo " $path_name is a executeable file"
	fi
else
	echo "this script cannot get the file/directory( $path_name)information ! "
fi

2、 以shell命令的返回值作为判断条件

# !/bin/bash
echo "input a directory"
read dir_name
if cd $dir_name > /dev/ null 2>&1
then
echo "enter directory : $dir_name succeed"
else
echo "enter directory: $dir_name failed"
fi
case分支

1、 根据选择的模式,打印不同的回答

# !/bin/bash
clear
echo "Do you like Linux?"
read like_it
case $like_it in
y | Y | yes | Yes)
	echo "Linux is a good friend of us."
	;;
n | N| no | No)
	echo "Try it, and you will like it . "
	;;
* )
	echo "your answer is: $like_it"
	;;
esac	
循环

for循环

1、循环输出操作系统的名字

# !/bin/bash
clear
for os in Linux Windows UNIX MAC
do
	echo "Operation System is : $os"
done

2、用命令行参数输入操作系统的名字并输出

#! /bin/bash 
for os  
do 
  echo "Operation System is: $os" 
done  

while循环

1、while循环输出1-10

# !/bin/bash
clear
loop=0
while [ $loop -ne 10 ]
do
	let loop=$loop+1
	echo "current value of loop is : $loop"
done

until循环

until循环输出1-10

# !/bin/bash
clear
loop=0
until [ $loop -eq 10 ]
do
	let loop=$loop+1
	echo "current value of loop is : $loop"
done
函数

1、参数的使用

# !/bin/bash
function demo_fun ( )
{
	echo "Your command is: $0$*"
	echo "Number of parameters ( \$#) is: $#"
	echo "Parameters ( \$* ) is: $*"
	echo "Parameters ( \$@) is: $@"
	count=1
	for param in $@
	do
		echo "Parameters ( \$$count) is: $param"
		let count=$count+1
	done
}
clear
demo_fun $@

2、shift的使用

# !/bin/bash
function function_shift ( )
{
	echo "Your command is: $0$*"
	echo "Number of parameters ( \$#) is: $#"
	echo "Parameters ( \$* ) is: $*"
	echo "Parameters ( \$@) is: $@"
	count=1
	while [ -n "$1" ]
	do
		echo "Parameters ( \$$count) is: $1"
		let count=$count+1
		shift
	done
}
clear
function_shift $@

函数返回值

1、显式返回

# !/bin/bash
function fun_return1 ( )
{
	dir_name=$1
	rtn_value=0
	if ! cd $dir_name > /dev/ null 2>&1; then
		rtn_value=1
	fi
	return $rtn_value
}
clear
if fun_return1 $@; then
	echo "function executes sucessfully ! "
else
	echo "function executes failed ! "
fi	

2、隐式返回

#! /bin/bash 
function fun_return2() 
{ 
  dir_name=$1 
  cd $dir_name > /dev/null 2>&1
  return 
} 
clear 
if fun_return2 $@; then 
  echo "function executes sucessfully!" 
else 
  echo "function executes failed!" 
fi
综合运用

1、 带一个(目录)参数,可浏览目录下的内容。(lsdir.sh) 实现功能: (1)首先判断(if)是否带有参数,若无则显示(echo)用法信息后,报错返回(exit); (2)首先判断该参数是不是目录。若是则列目录的内容(ls),否则,提示用户不是目录,则显示警告信息后报错返回。

运行:设程序名为lsdir.sh,为其增加执行权chmod 755 lsdir.sh

运行: ./lsdir.sh ./lsdir.sh dir #如果dir是个目录,则列其内容 ./lsdir.sh file #若file是文件或不存在则给出警告后返回

#! /bin/bash 
if [ $# -ne 1 ] 
then 
  echo "Usage: $0 dir"   
exit 1 
fi 
if [ -d "$1" ] 
then 
  ls -l $1/*    
  exit 0 
fi 
echo "Warn: $1 is not a directory"  
exit 2

2、只用嵌套结构if-fi实现上述程序 (lsdirif.sh)

#! /bin/bash 
if [ $# -ne 1 ] 
then 
  echo "Usage: $0 dir" 
  exit 1 
elif [ -d "$1" ] 
then 
  ls $1/* 
  exit 0 
else 
  echo "Warn: $1 is not a directory" 
  exit 2 
fi

3、带数值参数,并可计算这些数值参数之和(sum.sh)

#! /bin/bash 
x=0 
for y in $* 
do 
  x=`expr $x + $y` 
done 
echo "The sum is: $x"

4、文件备份的shell程序

#! /bin/bash
LOG_START_TIME=`date+"%Y%m%d%H%M%S"`
BACKUP_DIR=~/Lesson10/backup
BACKUP_LOG="$BACKUP_DIR/${LOG_START_TIME}.log"

function write_log(){
log_time=`date+%Y-%m-%d-%H-%M-%s`
backup_file_name=$2
err_msg="$log_time ERROR in backup file/directory($backup_file_name)"
suc_msg="$log_time SUCCESS in backup file/directory($backup_file_name)"
if [ $1 -eq 0 ] ;then
echo $suc_msg
echo $suc_msg>>$BACKUP_LOG
else
echo $ess_msg
echo $err_msg>>$BACKUP_LOG
fi
}

function backup_file(){
cp -fi$1 $BACKUP_DIR> /dev/null 2>&1
write_log $?$1
}

function create_log_file(){
if [ ! -e $BACKUP_DIR ];then
mkdir -p $BACKUP_DIR
fi
if [ -e $BACKUP_LOG ] ;then
rm -rf $BACKUP_LOG
fi
touch $BACKUP_LOG
}

clear
echo "Backup Process Begins"
create_log_file
for file in $@
do
backup_file $file
done
echo "Backup Process ends"

5、计算前n个正整数的和(sum_n.sh)

#! /bin/bash
if [ $# -ne 1 ]
then S
	echo "Usage: $0 n"
	exit 1
fi
x=0
y=0
while true
do
	x= 'expr $x + $y'
	y= 'expr $y + 1'
	if [ $y -gt $1 ]
	then
		break
	fi
done
echo "1+2+.....+$1 = $x"

6、编写shell程序(setmod.sh),在/home目录下建立10个目录,即user1~user10,并设置每个目录的权限,其中:

(1) 文件所有者的权限为:读、写、执行

(2) 文件所有者所在组的权限为:读、执行

(3) 其他用户的权限为:读

#! /bin/sh 
i=1 
while [ $i -le 10 ]
do 
  if [ -d /home ];then 
    mkdir -p /home/user$i  
    chmod 754 /home/user$i   
    echo "user$i"  
    let "i=i+1"   
  else 
    mkdir /home 
    mkdir -p/home/user$i   
    chmod 754 /home/user$i   
    echo "user$i"  
    let "i=i+1"  
  fi 
done

7、编写shell程序(setmod.sh),在/home目录下建立10个目录(即user1~user10)自动删除,并显示删除信息

#! /bin/bash 
i=1 
while [ $i -le 10 ] 
do 
  if [ -d /home/user$i ];then  
    rm -rf /home/user$i 
    echo "Directory /home/user$i deleted"  
  fi 
  let "i=i+1" 
done

8、编写九九乘法表的shell程序(multiply.sh)

#!/bin/bash
for ((i=1;i<=9;i++))
do
	for ((j=1;j<=i;j++))
	do
		let "sum=i*j"
		echo -n " $j*$i=$sum  "
	done
echo
done

9、在Linux中使用ls命令时,不显示统计信息。要求编写一个shell程序(tongji.sh),能统计出当前目录中子目录、文件数量

#!/bin/bash
fun_directory() {     
  let "filenum=0"
  let "dirnum=0"
  for i in $( ls )
do
   if [ -d $i ]
   then
      let dirnum+=1
   else
      let filenum+=1
   fi
done
echo "The number of directorys is $dirnum"
echo "The number of files is $filenum"
}
fun_directory

4. Linux概念辨析

4.1 Linux简答题题目(概念)

  1. Linux操作系统和Windows系统的区别,优越性
  2. docker技术概念,和虚拟机有什么区别
  3. shell编程求计算式表达
  4. 上课的冒号、反引号、单引号、双引号有什么区别
  5. Linux操作系统启动步骤:加载、引导blos
  6. Apache配置文件名
  7. Linux有多少种运行级别

4.2 题目解析

Linux概念来源

1、Linux操作系统和Windows系统的区别,优越性

Linux系统优点:

  1. 开放性。Linux操作系统遵守GNU规范,代码共享,易于实现系统的裁剪和客制化的开发
  2. 多用户。系统资源可以被不同用户以各自的权限访问使用,互不影响
  3. 多任务和多线程。不同任务和线程几乎同时并发处理独立的但内在关联的一系列事件
  4. 设备独立性:Linux操作系统把外部设备统一当做设备文件看待,只要安装他们的驱动程序,任何用户都可以像使用普通文件一样操纵、使用这些设备,而不必知道他们的具体存在形式。
  5. 丰富的网络功能:完善的内置网络是Linux的一大特点。

Linux系统缺点:

  1. 无特定支持厂商:因为Linux上面的软件包括系统都是免费发行的,所以不会有售后
  2. 图形界面不够友好
  3. 游戏支持度不足:在Linux上开发的大型游戏几乎没有。

Linux系统和Windows系统的区别:

  1. 开放性。Linux系统开放源码系统,可以对其程序进行编辑修改。而微软的Windows系统受微软版权保护,只能微软内部进行开发以及修改。
  2. 价格。Linux免费送使用,而Windows系统需要花钱购买。
  3. 文件格式不同。Windows操作系统内核是NT,而Linux是shell。Windows硬盘格式文件是fat32或者NTSF,而Linux需要的文件格式是ext2或ext3,还多一个SWAP格式的交换分区。

2、docker技术概念,和虚拟机有什么区别

Docker技术概念

Docker是一个开发,运输和运行应用程序的开放平台。Docker使您可以将应用程序与基础架构分离,以便快速交付软件。使用Docker,您可以像管理应用程序一样管理基础架构。通过利用Docker的方法快速发送,测试和部署代码,您可以显着减少编写代码和在生产中运行代码之间的延迟。

  1. Docker镜像:Docker镜像是我们把应用程序和运行环境打包在一起的文件,可以编写Docker file来告诉Docker如何把我们的环境和应用打包在一起,形成一个镜像文件。
  2. Docker仓库:Docker仓库是一台存放Docker镜像的服务器。可以将开发好的镜像上传仓库,也可以从仓库中拉取、分享镜像。
  3. Docker容器:Docker是镜像启动之后的实体。一个镜像可以启动多个实体。

3、shell编程求计算式表达

  1. 双尖括号 ((expression))

  2. 双方括号**[[expression]]**,支持字符串模式匹配即正则表达式

  3. 老方法

    1)执行数学表达式 expr

    expr 1+5

    2)单方括号

    $[ operation ]

4、shell编程中冒号、反引号、单引号、双引号有什么区别

冒号:

  1. 参数扩展:

    :abc=1234
    echo $abc
    
  2. 清空文件

    :>123.txt
    
  3. 脚本注释、占位符:在编写脚本的过程中,某些语法需要多个组成部分,但开始阶段没有想好,这样就可用来做占位符,执行起来就不会报错了。

反引号:反引号内作为一个系统命令并执行

例:time=`date`
    echo "Today is $time"
    结果:Today is Thu Dec  8 02:00:48 PST 2016
    echo $time
    结果:Thu Dec  8 02:00:48 PST 2016

单引号:所有转移符全部关闭,完整的反映括号中的内容

例:
    name="user"
    echo 'My name is  $name'
    结果: My name is $name

双引号:部分转义符关闭,但某些则保留(如:$ )

例: name="user"
    echo "My name is  $name"
    结果: My name is user

5、Linux操作系统启动步骤

  1. 内核的引导。

    当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

    操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

  2. 运行 init。

    init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

    init 程序首先是需要读取配置文件 /etc/inittab。

  3. 系统初始化。

    在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

    主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

  4. 建立终端 。

    rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

    init接下来会打开6个终端,以便用户登录系统

  5. 用户登录系统。

    用户的登录方式有三种:

    • (1)命令行登录
    • (2)ssh登录
    • (3)图形界面登录

6、Apache配置文件名

httpd.conf,yum安装后,apache配置文件httpd.conf存放在目录/etc/httpd/conf下

7、Linux有多少种运行级别

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

运行级别2:多用户状态(没有NFS)

运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

运行级别4:系统未使用,保留

运行级别5:X11控制台,登陆后进入图形GUI模式

运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值