linux命令及shell语法

0 阅读21分钟

常用命令一

常用的命令对应的一些单词缩写

www.zhihu.com/question/49…

useradd userdel usermod passwd 用户相关命令

su 命令

变更帐号为 root 并在执行 ls 指令后退出返回原使用者

su -c ls root

sudo执行

比如我们使用普通用户操作用户或者操作用户组、以及修改网卡配置文件的时候,需要切换到root用户才操作,此时我们可以使用sudo命令提高普通用户的操作权限,以达到操作目的

id 命令

我们如果需要查看当前账号详细信息的时候,比如查看它的用户id、群组id以及所属组的时候,我们就可以使用id命令进行查看

chgrp 更改属组

chown 更改属主和属组**

我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限(属主) 我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组(属组),然后来修改这个文件的权限,让用户组可读,这样用户组下面的每个用户都是可读的

Linux是多任务操作系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限

chmod 权限命令

Linux文件属性有两种设置方法,一种是数字,一种是符号

Linux的文件调用权限分为三级 : 文件属主、属组、其他。利用 chmod 可以控制文件如何被他人所调用。

| 权限/英文 | 缩写 | 数字序号 | | --- | --- | --- | | 读 read | r | 4 | | 写 write | w | 2 | | 执行 execute | x | 1 | | 无权限 | - | 0 |

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

参数-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

例如更改 这个文件所有人组都可以读写执行

chmod -R 777 文件或目录

top 显示进程信息 top
显示指定的进程信息,以下显示进程号为6972的进程信息,CPU、内存占用率等

top -p 进程号

ps 命令

ps命令类似于我们在Windows中通过任务管理器查看进程信息

Linux ps命令用于显示当前进程 (process) 的状态信息

ps -A  显示所有进程

显示所有进程信息 (更详细点)

-e显示所有进程,环境变量
-f全格式

ps -ef 

显示指定用户信息 

ps -u root 

lsof 查看端口占用

Linux 查看端口占用情况可以使用 lsof 和 netstat 命令。

lsof(list open files)是一个列出当前系统打开文件的工具。

lsof 查看端口占用语法格式:

lsof -i:8080

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

java 94502 xlwang 860u IPv6 0xfa2fac4b474f3817 0t0 TCP *:afs3-callback (LISTEN)

netstat 命令

netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。

netstat 查看端口占用语法格式:

netstat -tunlp | grep 端口号

  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名

例如查看 8000 端口的情况,使用以下命令: 

# netstat -tunlp | grep 8000 

tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      26993/nodejs

更多命令:

netstat -ntlp //查看当前所有tcp端口

netstat -ntulp | grep 80 //查看所有80端口使用情况

netstat -ntulp | grep 3306 //查看所有3306端口使用情况

kill 命令

引子: 前面,我们刚刚学习完了Windows上开发,比如,我们经常遇到的要给问题就是,我们需要经常的启动或者重启tomcat,有的时候会报端口冲突,这个时候,我们可能就去Windows的任务管理器中去结束这个进程 那么在Linux中我们可以通过kill命令来实现Windwos上手工结束进程的操作

杀死一个进程

kill 进程号

 kill -KILL 进程号  //强制杀死进程

 kill -9 进程号    //彻底杀死进程

shutdow 命令 关机

shutdown命令可以用来进行关闭系统,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机

参数说明

  • -t seconds : 设定在几秒钟之后进行关机程序。
  • -k : 并不会真的关机,只是将警告讯息传送给所有使用者。
  • -r : 关机后重新开机。
  • -h : 关机后停机。
  • -n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
  • -c : 取消目前已经进行中的关机动作。
  • -f : 关机时,不做 fcsk 动作(检查 Linux 档系统)。
  • -F : 关机时,强迫进行 fsck 动作。
  • time : 设定关机的时间。
  • message : 传送给所有使用者的警告讯息。

shutdown -h now 
或者直接用 shudown 立即关机

reboot 重启命令

参数

  • -n : 在重开机前不做将记忆体资料写回硬盘的动作
  • -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
  • -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
  • -f : 强迫重开机,不呼叫 shutdown 这个指令
  • -i : 在重开机之前先把所有网络相关的装置先停止

who 命令

在企业级开发过程中,我们使用who命令的时候常常需要快速重启服务器,在重启之前需要检测下有没有终端在连接(处理程序),如果有,可能就不会重启(会私下询问何时弄完,弄完后在重启),如果没有其他人连接,将执行快速重启

timedatectl 命令

timedatectl是用于控制系统时间和日期。可以用来查询和更改系统时钟于设定,同时可以设定和修改时区信息。 在实际开发过程中,系统时间的显示会和实际出现不同步;我们一般为了校正服务器时间、时区的时候会使用timedatectl命令

启用时间同步

TP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。

要开始自动时间同步到远程NTP服务器,在终端键入以下命令

timedatectl set-ntp true 

clear 命令

清除屏幕

exit 命令

执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出。状态值0代表执行成功,其他值代表执行失败。exit也可用在script,离开正在执行的script,回到shell

linux 文件目录相关命令

  • ls: 列出目录
  • cd: 切换目录
  • pwd: 显示目前的目录
  • mkdir:创建一个新的目录
  • rmdir:删除一个空的目录
  • cp: 复制文件或目录
  • rm: 移除文件或目录
  • mv: 移动文件与目录或修改文件与目录的名称

ls 命令

参数如下

  • -a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
  • -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
  • -l :长数据串列出,包含文件的属性与权限等等数据;(常用)

cd / 命令是跳转到根目录 Change Directory的缩写

cd ~ 命令是跳转到当前用户的家目录,如果是root用户,cd ~ 相当于 cd /root 如果是普通用户,cd ~ 相当于cd /home/当前用户名

总结

ls 显示不隐藏的文件与文件夹

ls -l 显示不隐藏的文件与文件夹的详细信息

ls -al 显示所有文件与文件夹的详细信息

相对路径 在输入路径时, 最前面不是以 / 开始的 , 表示相对 当前目录 所在的目录位置

绝对路径 在输入路径时, 最前面是以 / 开始的, 表示 从 根目录 开始的具体目录位置

mkdir 命令

参数说明:

  • -p 确保目录名称存在,不存在的就建一个
  • mkdir -p xx/yy的好处就是一次可以创建多级文件夹,若xx文件夹不存在,则先创建xx文件夹,然后在xx文件夹下创建yy文件夹

mkdir -p dirName 

rmdir 命令 

rmdir  aaa
rmdir -p aaa/bbb 

总结:
rmdir -p aaa/bbb也就是说
在删除bbb目录完成后,发现aaa目录也是空目录了,在删除完bbb后aaa也同时被删除了。
cp 命令
参数说明:
●-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
●-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
●-f:覆盖已经存在的目标文件而不给出提示。
●-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
●-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
●-r/R:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
●-l:不复制文件,只是生成链接文件。
例子 我们将aaa下面的所有文件、目录复制到了目录ccc下面 

cp -r aaa/*  ccc 

总结:
用户使用该指令复制目录时,必须使用参数"-r"或者"-R"。
如果不加参数"-r"或者"-R",只复制文件,而略过目录
rm 删除命令 mv 移动命令
touch 命令 创建文件
stat 文件或目录
查看文件/目录的属性、包含访问时间、更改时间、最近改动时间都显示出来了
vi/vim 命令
vi/vim模式主要分为以下三种:
命令模式:在Linux终端中输入“vim 文件名”就进入了命令模式,但不能输入文字。 **编辑模式:**在命令模式下按i就会进入编辑模式,此时就可以写入程式,按Esc可回到命令模式。 **末行模式:**在命令模式下按:进入末行模式,左下角会有一个冒号出现,此时可以敲入命令并执行
vim相关快捷键可以去菜鸟教程去看
编辑模式较常用快捷键

| 命令 | 英文 | 功能 | 常用 | | --- | --- | --- | --- | | i | insert | 在当前字符前插入文本 | 常用 | | I | insert | 在行首插入文本 | 较常用 | | a | append | 在当前字符后添加文本 | | | A | append | 在行末添加文本 | 较常用 | | o | | 在当前行后面插入一空行 | 常用 | | O | | 在当前行前面插入一空行 | 常用 |

以下为其他的退出模式:
:q 当vim进入文件没有对文件内容做任何操作可以按"q"退出
:q! 当vim进入文件对文件内容有操作但不想保存退出
:wq 正常保存退出
:wq! 强行保存退出,只针对与root用户或文件所有人生效
cat/tail/less 命令

| 命令 | 对应英文 | 作用 | | --- | --- | --- | | cat 文件名 | concatenate | 查看小文件内容 | | less -N 文件名 | less | 分频 显示大文件内容 | | head -n 文件名 | | 查看文件的前一部分 | | tail -n 文件名 | | 查看文件的最后部分 | | grep 关键字 文件名 | grep | 根据关键词, 搜索文本文件内容 |

总结:

以上5个命令都可以查询文件的内容,他们的功能如下
通过 cat 会一次显示所有的内容, 适合 查看内容较少 的文本文件
less 命令适合查看 内容较多 的文本文件
通过 head 命令查看文档的前几行内容
通过 tail -10f 文件 命令 查看文档(日志)的后几行内容
通过 grep 命令 搜索存在 关键字 的行

grep 命令

(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep命令在使用的时候类似于我们的程序中的查询,或者在txt文档中通过ctr+f查找 grep除了能对文件操作为还可以查看我们的进程信息,类似于我们在Windows系统的任务管理器(任务栏--右键---启动任务管理器--进程)下的进程
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

搜索 存在关键字【eeee】 的行的文件

grep eeee txtfile.txt

搜索 存在关键字【eeee】 的行 且 显示行号

grep -n eeee txtfile.txt

忽略大小写 搜索 存在关键字 的行

grep -i EEEE txtfile.txt

搜索 不存在关键字 的行

grep -v 中国 txtfile.txt

查找指定的进程信息(包含grep进程

ps -ef | grep sshd

查找指定的进程信息(不包含grep进程)

ps aux | grep sshd | grep -v "grep"

查找进程个数

ps -ef | grep -c sshd

动态显示文档的最后内容,一般用来查看日志,请输入以下命令

tail -f txtfile.txt

vim定位行

在日常工作中,有可能会遇到打开一个文件,并定位到指定行的情况 例如: 在开发时, 知道某一行代码有错误,可以快速定位到出错误代码的位置 这个时候,可以使用以下命令打开文件

我们打开文件定位到第6行,如下

vim txtfile.txt +6

echo 命令 

echo命令有点类似于我们在java se阶段学习的 System.out.print("hello") 但是,echo还有一个功能就是追加文件内容到文件,类似于我们在java se阶段学习的append文件流写入一样

echo 哈哈程序员 >> czbk.txt

总结

  • 通过 命令 > 文件 将命令的成功结果 覆盖 指定文件内容
  • 通过 命令 >> 文件 将命令的成功结果 追加 指定文件的后面
  • 通过 命令 &>> 文件 将 命令的失败结果 追加 指定文件的后面

awk 命令

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

、数据准备:czbk-txt.txt文本内容如下:zhangsan 68 99 26
lisi 98 66 96
wangwu 38 33 86
zhaoliu 78 44 36
maq 88 22 66
zhouba 98 44 46

ln -s 软连接

软连接其实就类似于我们在Windows中的【快捷方式】

语法如下:

| 命令 | 英文 | 作用 | | --- | --- | --- | | ln -s 目标文件绝对路径 快捷方式路径 | link | 给目标文件增加一个软链接, 通俗讲就是快捷方式 |

 ln  -s /home/itcast/txtfile.txt    czbk-txt

find 命令

find命令用来在指定目录下查找文件。

任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find <指定目录> <指定条件> <指定内容>

/代表是全盘搜索,也可以指定目录搜索

find / -name  'czbk'

gzip gunzip 命令压缩解压文件

例如解压文件

gunzip 001.gz 

zip unzip 命令

Linux 用于压缩或解压zip文件

unzip命令就完全的相当于在Windows下面选中文件右键进行解压缩了

tar 命令

tar的主要功能是打包、压缩和解压文件。 tar本身不具有压缩功能。他是调用压缩功能实现的 。

语法 tar 必要参数 选择参数 文件

tar -cvf txt.tar txtfile.txt 

cvf 是压缩文件(Compressed Volume File)缩写 xvf x (extract 提取,提炼;取出)是解压缩已归档的指定

查看tar中有哪些文件命令 tar -ztvf txt.tar.gz (这种类似win/mac查看压缩文件里面的内容 预览)

cvf zxvf 等前面的-可以加可以不加

总结

tar zxvf 用于解压 .tar.gz 后缀结尾的

tar xvf 用于解压 .tar后缀结尾的

tar cvf etcbak.tar etc/ 打包一个tar

tar zcvf etcbak.tar.gz etc/ 打包压缩一个 tar.gz

.gz 由gzip压缩工具压缩的文件。

.tar 由tar打包程序打包的文件(tar没有压缩功能,只是把一个 目录合并成一个文件)

.tar.gz 可理解为先由tar打包,再由gz压缩。

.zip: 可理解为由zip压缩工具直接压缩

bzip2 bunzip2 命令

引子 ".bz2"格式是 Linux 的另一种压缩格式,从理论上来讲,".bz2"格式的算法更先进、压缩比更好;而 咱们上面学到的".gz"格式相对来讲时间更快 在使用过程中可以根据需求自由选择

df 命令

显示磁盘使用情况统计情况也可以显示磁盘使用的文件系统信息

df /home/xlwang/Desktop/

上面现在占用大小都是字节显示,我们一般希望输出显示的数字形式的'G'(千兆字节),"M"(兆字节)和"K"(千字节)

df -h

mount/umount 命令

在Linux当中所有的存储设备如u盘、光盘、硬盘等,都必须挂载之后才能正常使用。 其实挂载可以理解为Windows当中的分配盘符(重要),只不过windows当中是以英文字母ABCD等作为盘符,而linux是拿系统目录作为盘符,当然linux当中也不叫盘符,而是称为挂载点,而把为分区或者光盘等存储设备分配一个挂载点的过程称为挂载

挂载概念

在安装linux系统时设立的各个分区,如根分区、/boot分区等都是自动挂载的,也就是说不需要我们人为操作,开机就会自动挂载。但是光盘、u盘等存储设备如果需要使用,就必须人为的进行挂载。

其实我们在windows下插入U盘也是需要挂载(分配盘符)的,只不过windows下分配盘符是自动的

Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”

注意:“挂载点”的目录需要以下几个要求:

(1)目录事先存在,可以用mkdir命令新建目录;

(2)挂载点目录不可被其他进程使用到;

(3)挂载点下原有文件将被隐藏。

2、创建挂载点

注意:一般用户无法挂载cdrom,只有root用户才可以操作

我们切换到root下创建一个挂载点(其实就是创建一个目录)

mkdir -p mnt/cdrom

3、开始挂载

通过挂载点的方式查看上面的【ISO文件内容】

mount -t auto /dev/cdrom /mnt/cdrom

shell 语法

Shell 被当成是一种脚本语言来设计,其运作方式与解释型语言相当,由 Unix shell 扮演命令行解释器的角色,在读取 shell 脚本之后,依序运行其中的 shell 命令,之后输出结果。利用 shell 脚本可以进行系统管理,文件操作等。

在 Unix 及所有的系统中,如 Linux、FreeBSD 等操作系统,都存在 shell 脚本。依照 Unix shell 的各种不同类型,shell 脚本也有各种不同方言。在 DOS、OS/2、Microsoft Windows 中的批处理文件,跟 shell 脚本有类似的功能。

java需要虚拟机解释器, 同理 shell脚本也需要解释器

查看电脑有哪些shell解释器

cat /etc/shells

#!/bin/bash  --- 指定脚本解释器
echo "你好,播客 !"

注意:

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。echo 命令用于向窗口输出

shell 注释

# 这里可以添加脚本描述信息
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

shell 变量

1、定义变量 variable_name="czbk"

量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样

2、使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

variable_name="czbk"

echo $variable_name

echo ${variable_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

echo "I am good at ${shell-t}Script"

通过上面的脚本我们发现,如果不给shell-t变量加花括号,写成echo "I am good at shelltScript",解释器shell就会把shell-tScript",解释器shell就会把shell-tScript当成一个变量,由于我们前面没有定义shell-t变量,那么解释器执行执行的结果自然就为空了。这里我们推荐给所有变量加上花括号,这也是一个好的编程习惯。

3、只读变量

这里的只读变量其实有点类似于我们在java se阶段课程中定义的final变量,即在程序的上下文中不允许被程序修改

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="https://www.baidu.com"
readonly myUrl
myUrl="https://cn.bing.com/" 
#会报错 只读变量 不能再次赋值

4、删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

shell 字符串

单引号

str='this is a string variable'

单引号字符串的限制:

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

双引号

your_name='frank'

str="Hello, \"$your_name\"! \n"

echo -e $str

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串

your_name="frank"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

获取字符串长度

string="czbk"

echo ${#string}

提取截取字符串

string="abcdefghijklmn"
echo ${string:1:4} 

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。如下:

数组名=(值1 值2 ... 值n)

例如

例如:

array_name=(value0 value1 value2 )

或者

array_name=(

value0 value1 value2

)

再或者 通过下标定义数组中的其中一个元素

array_name[0]=value0 array_name[1]=value1

读取数组

${数组名[下标]}

例如:valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

获取数组的长度

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

# 取得数组元素的个数 length={#array\_name\[@\]} # 或者 length={#array_name[*]}

shell运算符

原生 bash **不支持 **简单的数学运算,但是可以通过其他命令来实现,例如expr。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

1、算数运算符

val=`expr 2 + 2`

echo "相加之后的结果为:" $val

表达式和运算符之间要有****空格,例如 2+2 是不对的,必须写成 2 + 2。

表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

| * | 乘法 | expr a\*a \\\* b 结果为 200。 | | --- | --- | --- |

| = | 赋值 | a=b将把变量b的值赋给a=ˉ相等。用于比较两个数字,相同则返回true\[b 将把变量 b 的值赋给 a。 | | --- | --- | --- | | \== | 相等。用于比较两个数字,相同则返回 true。 | \[ a == b \] 返回 false。 | | != | 不相等。用于比较两个数字,不相同则返回 true。 | \[ a != $b ] 返回 true。 |

**注意:**条件表达式要放在方括号之间,并且要有空格,例如: [a==a==b] 是错误的,必须写成 [ a==a == b ]

#! /bin/bash
#g=(a b c d e f)
#echo "数组下标为2的数据为:" ${g[2]}
#echo  "数组所有数据为:"  ${#g[@]}
#echo  "数组所有数据为:"   ${#g[*]}
:<<EOF
val= `expr 2 + 2`
echo "相加之后的结果为:" $val
EOF

a=4
b=20
echo “加法运算”  `expr $a + $b`
echo “减法运算”  `expr $a - $b`
echo “乘法运算,注意*号前面需要反斜杠” ` expr $a \* $b`
echo “除法运算”  `expr  $b / $a`
((a++))
echo "a = $a"
c=$((a + b)) 
d=$[a + b]
echo "c = $c"
echo "d = $d"

2、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

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

a="abc"
b="efg"

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

3、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

| 运算符 | 说明 | 举例 | | --- | --- | --- | | -eq | 检测两个数是否相等,相等返回 true。 | [ aeqa -eq b ] 返回 false。 | | -ne | 检测两个数是否不相等,不相等返回 true。 | [ anea -ne b ] 返回 true。 | | -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ agta -gt b ] 返回 false。 | | -lt | 检测左边的数是否小于右边的,如果是,则返回 true。less than | [ alta -lt b ] 返回 true。 | | -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ agea -ge b ] 返回 false。 | | -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ alea -le b ] 返回 true。 |

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
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

4、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

| 运算符 | 说明 | 举例 | | --- | --- | --- | | ! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 | | -o (or的意思) | 或运算,有一个表达式为 true 则返回 true。 | [ alt20oa -lt 20 -o b -gt 100 ] 返回 true。 | | -a (and的意思) | 与运算,两个表达式都为 true 才返回 true。 | [ alt20aa -lt 20 -a b -gt 100 ] 返回 false。 |

5、逻辑运算符

假定变量 a 为 10,变量 b 为 20:

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

注意: 布尔运算符是一个[一个逻辑运算符是两个[[

判断语句

主要用于判断,相当于java se中的if else-if else

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

for 循环 while循环和类似

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
for loop in A B C D E F G 
do
    echo "顺序输出字母为: $loop"
done

case 语句

主要用于分支条件选择,相当于java se中的switch case循环

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

v="czbk"

case "$v" in
   "czbk") echo "播客"
   ;;
   "baidu") echo "baidu 搜索"
   ;;
   "google") echo "google 搜索"
   ;;
esac

shell 函数

function test_func()
{
    echo "output from inside-function:test_func"
    echo 'input parameter1: '$1
    echo 'input parameter2: '$2
}
echo "here is main function"
echo "now inside function: test_func"
test_func hello world 
function czbk(){
    echo "对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
czbk
echo "输入的两个数字之和为 $? !"

注意:

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

Linux Shell . xx.sh 和./xx.sh 运行脚本的区别

Linux Shell . xx.sh 和./xx.sh 运行脚本的区别_xyz的博客-CSDN博客_. xx.sh