linux 基础知识
😂 linux 基础知识
2022/10/17
➡️

一些认知

debian Debian计划是一个致力于创建一个自由操作系统的合作组织,我们所创建的这个操作系统名为Debian,
内核采用 linux 或 FreeBSD(类型unix),debian gnu 创建了大量的应用软件供使用者使用,并提供了apt, 软件包管路工具,伊恩·默多克 是 debian 创始人,ubuntu 是基于debian 的发行版

技巧

便捷用法 双击左键 copy 中键 paste 输入 ca 后单击 tab 键俩次会打印所有以ca 打头的命令

目录

linux 只有一个跟目录 / 余下的目录或文件都在这个根目录下面

/bin: 存放二进制可执行文件(系统引导,ls,cat,mkdir等),常用命令一般都在这里

/etc: 存放系统管理和配置文件

/home:
存放所有普通用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/wind可以用~wind表示

/usr :

路径 mark
usr/bin linux 发现版安装的应用程序
usr/lib linux bin 应用程序的共享库
usr/sbin 系统管理工具
usr/share linux bin 应用程序共享的数
usr/share/doc linux bin 应用程序自带的文
usr/local 包含的程序不是 linux 发行版自带的应用程序,是用户发布的应用程序

/opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat安装包放在到这里

/proc: 英文处理的意思 虚拟文件系统目录,是系统内存的映射,可以观察linux 内核是如何管理计算机的,可直接访问这个目录来获取系统信息

/root: 超级用户(系统管理员)的主目录(特权阶级^o^)

/sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;

/dev: 用于存放设备文件;

/mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;

/boot: 存放用于系统引导时使用的各种文件,linux 内核

/lib :
存放着和系统运行相关的共享库文件 ;

/tmp: 用于存放各种临时文件,是公用的临时文件存储点,断电数据会被丢弃

/var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志),数据库等 /var/log存放的是日志文件

/lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.ch)就在这里。

/media 系统用来挂在光驱,U盘等移动设备的临时文件系统的挂载点

绝对和相对目录

在Linux下,所有以点开始的文件都是“隐藏文件”,对于这类文件,只使用命令ls >-l是看不到的,必须要使用ls -la才可以看到

  1. 查看当前绝对路径 pwd
  2. 相对路径 && 特殊目录 . 和 .. 在每个目录下,都会固定存在两个特殊目录,分别是一个点(.)和两个点(..)的目录。
    • 一个点(.)代表的是当前目录
    • 两个点(..)代表的是当前目录的上层目录

目录的常用操作

cd 该命令是change directory的简写,切换工作目录

  1. mkdir -p 创建目录 -p 表示目录不存在就创建一个
    • mkdir -p newDir 创建一层目录
    • mkdir -p newDir1/newDir2 创建多层目录
    • mkdir -p newDir1/{newDir11,newDir12} 创建newDir1及在其下在创建俩个子目录newDir11,newDir12
  2. rmdir rm 删除目录
    • rmdir 只能删除空目录 一次只能删除一层目录,并且是空目录
    • rm -r 递归删除目录内的所有文件及子目录及文件,最后删除目录,每一次删除都要确认
    • rm -rf 强制删除目录内的所有文件及子目录及文件并不进行提示
    • rm -rfv 强制删除目录内的所有文件及子目录及文件有提升
  3. cp 复制文件及目录 复制文件
    • cp sourceFileName NewFileName 拷贝到当前目录的新文件内
    • cp sourceFileName dir/NewFileName 拷贝到其他存在的目录,如果文件同名可以省去文件名 dir/
    • cp -r existDir1 existDir2 -r 代表递归的意思 复制目录

快捷的写法

  • cd 切换到当前用户的工作目录
  • cd - 在最近的俩次目录之间切换
  • cd ~wind 切换到 home 下的 wind 用户
  • cd ../ 或 cd .. 返回到上层目录
  • cd ./dir 当前目录下的dir 目录
  • cd ../../ 上俩层目录

文件

Linux遵循一切皆文件的规则,对Linux进行配置时,在很大程度上就是处理文件的过程

  1. touch fileName 创建文件,如果已经存在同名文件,就修改文件的创建时间,不会修改文件的内容
  2. rm fileName
  3. mv 移动或重命名文件 mv 后跟俩个参数
    • 如果第二个参数是目录代表是移动文件,移动后源目录的文件会被删除 移动文件的时候也可以重命名文,目录后跟一个文件名
    • 如果第二个参数是文件代表的是重命名文件
  4. cat 该命令是concatenate的简写,用户查看文件的全部内容 cat -n 有行号 cat a.txt b.txt >> c.txt 把 a.txt b.txt 的内容追加到 c.txt cat a.txt | cmd 把 a.txt 做为cmd 的参数
  5. head -n 20 查看文件的指定的前20行内容, 不使用 -n 默认查看前10行
  6. tail 查看文件的后几行用法和 head 一样
  7. dos2unix 把 windows 文件转换为 unix 格式的文件,因为俩种系统的换行符不一致
  8. file fileName 显示文件类型
  9. less 打开新窗口查看文件,可以通过方向箭头翻页,q 键退出
  10. stat fileName 显示文件详细内容

显示文件的命令

  • ls 显示当前目录
  • ls dirName 显示指定目录
  • ls dirName1 dirName2 显示多个指定目录
  • ls -l 用长格式显示(long)
  • ls -a 显示所有目录及文件(all)
  • ls -al
  • ls -t 按照创建时间进行排序
  • ls -r (reverse)对时间倒序排序显示

脚本中常用的通过cat 写入文件

cat命令结合重定向功能实现文本内容写入 EOF(end of file)

  • 将stdin标准输入的内容重定向到test.txt文件(若此文件不存在,则创建),且当stdin中含有EOF时完成写入
  • cat 追加内容用 >>,覆盖内容用 >
  • 其中EOF可以替换为任意字符串
  • <<EOF 开始输入
   cat <<EFO  >b.txt
   # 或 cat  >b.txt  <<EOF  或追加内容 cat  >>b.txt  <<EOF
   content
   EOF

管道

|是pipe的意思,它可以把多个命令联系起来,前面命令的输出,将作为后面命令的输入

seq 1 10 | head -n 5 | tail -n 1 #5

sort -k 要排序的列 如k1 表示第一列 >>-t 指定分割字符 >>-n 按照数值大小排序 >>-r 倒序

uniq -C 显示每行重复的次数 >>-u 只显示出现1次的行

文件的硬连接 和软链接

硬连接

硬连接的文件是互相备份的一个文件修改会更新另外的文件,删除一个文件,不会影响另外的文件

软连接

软连接 只是创建一个指向源文件的 link 源文件删除 link 就不会指向任何文件

 # 创建源文件
 vi a
 # 创建硬连接 
 ln a b
 # 创建软链接
 ln -s  a c

文件及目录权限

如下文件 第一列是文件类别和权限10个字符组成,的一个字符文件类型,24 个字符是文件使用者的权限,57 是文件所有组的权限,8~10 是其他用户的权限 第二列是连接数 文件为1,目录是目录内包含的目录+2 第三列是文件的所有人 第四列是文件的所有组 第五列是文件的大小 第六列是文件的创建时间或修改时间 第七列是文件的名字

  • r 读
  • w 写
  • x 可执行
root@ubuntu:~# ls -al  a.txt
-rw-r--r-- 1 root root 0 May 19 04:23 a.txt

文件或目录类型

第一个字符的含义 含义
d 目录
- 普通文件
l 链接文件
b block 文件
c 字符文件
s socket 文件
p 管道文件

更改权限 chmod (change mod)

只有文件的所有者或 root 用户才能更改文件或目录的权限 Linux下的每个文件都定义了文件拥有者(user)、拥有组(group)、其他人(others)的权限,我们使用字母u、g、o来分别代表拥有者、拥有组、其他人,a 代表所有人

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限进行覆盖

符号表示法

 #所有人对文件有 file1.txt 读取权限
 chmod ugo+r file1.txt 
 #或
 chmod a+r   file1.txt 
 
 #将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入  
 #但其他以外的人则不可写入 
 chmod ug+w,o-w file1.txt file2.txt

 #所有人对 dirName 目录下的所有目录及文件有读取权限
 chmod -R ugo+r dirName

数字表示法,同时给不同的用户设置不同的权限 定义r=4,w=2,x=1,如果权限是rwx,则数字表示为7,如果权限是r-x,则数字表示为5

   # 文件所有者是rwx,文件所属的组是 r-x ,其他用户是 r--
   chmod 754 file1.txt 

更改拥有则和所属组

 # 更改所有者
 chown  bob file1.txt
 # 更改所有组
 chown  :joni  file1.txt
 # 更改所有者和所有组
 chown  bob:joni file1.txt
 #递归更改
 chown -R  bob dirName
 # 更改所有组
 chgrp joni file1.txt

用户管理

命令 备注
useradd -m 用户名 添加用户,并自动创建用户的家目录
useradd -m -g 用户组 用户名 增加用户的时候同时指定用户组
passwd 用户名 添加密码
userdel 用户名 删除用户保留家目录和邮件
userdel -r 用户名 删除用户不保留家目录和邮件
groupadd 用户组名 添加用户组 在 /etc/group 查看所有的用户组
groupdel 用户组名 删除用户组
finger (用户名) 显示更详细的用户信息
chpasswd 用户名 更改用户的密码
usermod -g 用户组 用户名 更改用户的组

users,who, w 都可以查看当前登录的用户

切换用户

su (switch user)

 su        #默认切换root 用户,不切换用户环境
 su -      #切换root,同时切换用户环境
 su 用户名  #切换普通用户
 exit      #退出当前用户

su (switch user) 切换用户需要输入密码不安全,用 sudo代替,在执行命令前加 sudo sudo 需要在 /etc/sudoers 文件里进行配置 加入 wind ALL=(ALL) ALL”这一行代表的意思是,john这个用户(第一列)可以从任何地方登录后(第二列的ALL)执行任何人(第三列的ALL)的任何命令(第四列的ALL)。还可以定义某一个组的sudo权限,比如“%windGroup ALL=(ALL) ALL”可以让所有属于john用户组的用户从任何地方登录后执行任何人的任何命令

需要知道自己的密码就可以使用sudo执行任何命令,这样方便多了。但是每次都需要输入一遍密码也是比较麻烦的事情,想要实现不需要输入密码就可以执行命令,可以在最后一个ALL前添加NOPASSWD:

严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令

  # User privilege specification
  root    ALL=(ALL:ALL) ALL
  wind    ALL=(ALL:ALL) ALL

查看所有的用户和组

root 账号

  #查看所以用户
  cat /etc/passwd
  #查看用户密码
  cat /etc/shadow
  #查看所有组
  cat /etc/group

查找

字符串查找 grep 配合正则表达式

grep (global search regular expression and print out the line) 的缩写

grep >> -r 递归包括子目录 >> -n 显示匹配的到行数 >>--color 彩色显示 >> -E 正则表达式匹配 >> -v 反向匹配 >> -l 不区分大小写 >> -A 匹配内容的后几行 >> -B 匹配内容的前几行 >> -C 匹配内容的前后几行

查询 a.txt 文件里包含 欧克

   grep -rn  ok  a.txt

普通查找 find

  find /root -name  a.txt
  find /root -name  a*

数据库查找 locate

与find不同,locate命令依赖于一个数据库文件,Linux系统默认每天会检索一下系统中的所有文件,然后将检索到的文件记录到数据库中。在运行locate命令的时候可直接到数据库中查找记录并打印到屏幕上,所以使用locate命令要比find命令反馈更为迅速

  # 可以更新下数据库,不是必须的
  updatedb
  # 在数据库查找 a.txt
  locate a.txt

查找可执行文件

  # 查找 passwd 文件的路径
  which  passwd
  # 查找 passwd 文件的路径 及帮助文档
  whereis passwd

网络

  # ctrl+c 可以终端
  ping baidu.com
  # 连续发10此后停止
  ping -c 10  baidu.com
  #追踪达到目标经过的路径
  traceroute baidu.com
  # 显示网卡
  ip a 
  ip addr
  ifconfig

包管理

dpkg 是底层工具 apt 是基于 dpkg 的高层工具 apt (Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器 apt 执行需要 apt 权限

rmp 是red hat 的底层工具 ,yun 是基于rmp 的高层工具

老版本linux 叫 apt-get 新版本 apt

    # 显示所有需要更新的包
    apt  update 
    # 更新所有的包
    apt upgrade 
    # 安装包
    apt install  package_name
    # 卸载包
    apt remove   package_name
    apt autoremove # 自动清除一些不再使用的依赖和库文件
    
    # 等同于上面俩条
    apt -purge remove package_name
    
    # 显示已经安装的包
    apt  list

    # 查看安装包的信息
    apt show package_name
    # 或
    apt-cache show package_name
    
    # 搜索包
    apt search searchword

    确定是否已经安装了软件包 dpkg (debian package)
    # dpkg -s package_name

重定向

  • > 把屏幕命令产生的内容定向到文件 覆盖
  • >> 把屏幕内容定向到文件 追加
  • < 把文件作为命令的输入

正则表达式

shell 脚本

shell 是一个脚本执行环境,常用的 shell 是 bash shell 脚本的第一行 $!/bin/bash,shebang 标记解释器 脚本的路径不在 $PATH 的目录里执行脚本要指定脚本的路径 脚本要有执行权限

  #给所有用户执行权限
  chmod +x   script.sh

注意点

  1. 命令分俩种 内置命令和外部命令(外部程序),内部命令常驻内存执行快,通过 type 命令 测试命令类型 type -a 查看命令的所有定义 type -t 查看命令的类型
  2. exit 返回值 不是用 return
  3. 命令参数有长,短区分,--reverse 是长参数 -r 是短形式
  4. 多个命令一起执行用 ; 隔开

常用的关键字如下:

  1. echo:打印文字到屏幕
    echo 默认是输出一行文本,如果要输出多行文本用 " " 包围多行文本 echo 默认换行,如果不要换行,增加参数 -n echo 默认会把字符原样输出 -e 会对转义字符进行处理 \n 等

  2. exec:执行另一个 Shell 脚本

  3. read:读标准输入

  4. expr:对整数型变量进行算术运算

  5. test:用于测试变量是否相等、 是否为空、文件类型等

  6. exit:退出

命令的组合 && 和 || 短路的功能 && 只有前一个命令成功了,才会执行后面的命令 || 如果前一个命令执行失败了,才会执行后面的命令

快捷键

  • ctrl+L 清屏
  • ctrl+c 中止当前的命令
  • tab 输入部分命令来进行补全
# 查看是否安装了 bash
echo $SHELL
# bash 的版本
echo $BASH_VERSION

cat /etc/shells

扩展及$PATH

查看当前的PATH

  echo $PATH

常用的扩展

符合 说明 实例
~ 代表当前的用户目录
~wind 代表当前的 wind 用户目录
匹配任意单个字符 ls ?.txt
* 匹配任意多个字符,包括零个 ls *.txt
[] 匹配方中括号里的任意一个字符 ls [ab].txt
[!]或[^] 排除中括号里的字符 ls [!ab].txt
[start-end] 一种简写形式 ls [abc].txt 等同 ls [a-c].txt
[start-endstart-end] 可以连续写多段 也可以和!配合 [a-z0-9], [a-zA-Z]
{} 扩展大括号里的所有值,每个都要匹配到,括号内用逗号隔开 ls {a,b,c}.txt

{} 扩展

{} 大括号可以嵌套

 echo  {a{1,3},b} 
 a1 a3 b

{}可以配合其他符号

  echo ls  {a,b*}.txt

{}连续

  echo num_{1..3}
  num1,num2,num3

{}连续,可以指定步长

  echo num_{1..5..2}
  num1,num3,num5

子命令扩展

$(...)可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值

echo $(ls)
#或
echo $`ls`

变量

变量名一般要大写,通过 ${varName} 使用变量的值

1.用户自定义变量

    foo="123"
    # 自读变量
    readonly rName="jim"
    # 或
    declare -r  rName="jim"
    # 删除变量
    unset foo
    # 用户定义的全局变量
    export bar="456"

2.预定义变量

  • $0 文件本身
  • $0~$9 执行文件传入的参数
  • $* 或$@ 所有传入的参数
  • $? 上一个文件(命令)的返回值
  • $$ 执行文件(命令)的进程Id

3.环境变量,环境变量默认就存在,常用的如下

  • HOME:用户主目录
  • PATH:系统环境变量 PATH
  • TERM:当前终端
  • UID:当前用户 ID
  • PWD:当前工作目录,绝对路径
   echo $PATH

4.自定义环境变量

  export foo=1
  # 这样也可以定义环境变量
  declare -x  foo

>脚本默认是在当前进程(bash)内开辟一个子进程,子进程是可以使用当前进程(bash)内的环境变量,子进程不能使用当前进程的本地变量

在脚本执行路径的前面加 source 可以让脚本就在当前进程执行,就可以共享所有的变量

当变量值为空或者非空时对变量进行操作

   foo=""
   bar=""
   zoo=123
   # foo 为空的时候返回123,赋值 123 给 bar
   echo  ${foo:="123"}
   echo $foo
   
   # foo 为空的时候返回 123,但是不赋值给 bar
   echo  ${bar:-"123"}
   echo $bar

   # foo 不为空的时候返回 123,但是不赋值给 bar
   echo  ${zoo:+"456"}
   echo $zoo

字符串分 "" 和 ''

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 双引号里可以有变量
  • 双引号里可以出现转义字符
  foo="jim"
  bar="hi-${foo}"
  echo  $bar  # hi-jim
  # 读取字符串长度
  echo  ${#bar} #7 

截取字符串

foo="jim"
bar="hi-${foo}"
# 默认0 开始,开始位置1,往后截取三个字符
echo  ${bar:1:3} # i-j
# 倒着截取默认 1 开始,倒数第3个位置开始,往后截取1个字符
echo  ${bar:0-3:1} # j  

替换变量中的字符串 && 删除字符串

替换变量中的字符串

#!/bin/bash
foo=abc_abc
# 替换第一个匹配的字符 a 为  ^
echo ${foo/a/^}
# 替换所有的 a 为 ^ 
echo ${foo//a/^}

# 替换开头位置
echo ${foo/#a/$}
# 替换结束位置
echo ${foo/%c/¥}

删除字符串 和替换字符串类似

#!/bin/bash
foo=abc_abc
# 删除第一个匹配的字符 a 
echo ${foo/a}
# 删除所有的 a 
echo ${foo//a}

# 删除开头位置
echo ${foo/#a}
# 删除结束位置
echo ${foo/%c}

字符串大写写转换

foo=abc
bar=ABC
# 转换为大写
echo ${foo^^}
# 转换为小写
echo ${foo,,}

数组

  • 通过()生成数组,元素中间空格隔开 arr=(1 2)
  • ${arr[*]} 或 ${arr[@]} 取数组的所有元素
  • ${#arr[*]} 或 ${#arr[@]} 获取数组的长度
  • arr[2]=3 在原有数组的基础上继续扩增数组
  • arr=([1]=1 [5]=5)只给特定的元素赋值
  • ${arr[1]} 去数组元素的值
  arr=(1a 2a 3a 4a)
  echo  ${#arr[*]}
  for i in ${arr[*]}
  do
    echo  $i
  done

数组拼接

 arr1=(1 2)
 arr2=(3 4)
 #(1 2 3 4)
 newArr=(${arr1[@]} ${arr2[@]})

删除数组或数组元素

  arr=(1 2 3)
  # 取消数组的第 0 个元素
  unset ${arr[0]}
  # 取消整个数组
  unset arr

shell 运算

用空格隔开各个部分是最安全的

  • $((表达式)) 只能用于整数运算
  • let 类型 (()) 只能用于整数运算
  • $[表达式] 数学或字符串运算都可以 运算符 >,< 这些需要转义才行 $[[表达式]] 数学或字符串运算都可以 运算符 >,< 这些不需要转义
  • expr 表达式 只能用于整数运算
  • awk
  • declare
  • bc 只支持小数运算

shell 运算不同于其他高级语言,在shell 脚本里变量的值都是字符串

 M=1
 M=$M+1
 echo $M # 1+1

如果要实现数学运算或逻辑运算,需要执行求值表达式

  # + 号左要有空格
  M=$[ M + 1]
  # 或,+ 号左右不能有空格
  M=$((M+1))
  # 或, + 号左右不能有空格
  let M=M+1
  # 或= 右边的表达式需要用 ` ` 包围起来, + 号左右要有空格 ,法 * 需要转义
  M=`expr $M + 1`

常见的运算符

运算符 说明
+ 加法
- 减法
* 剩法
/ 除法
% 取余
= 赋值
== 比较俩个数字是否相等
!= 比较俩个数字是否不相等

-eq, -ne,-gt ,-lt,-ge,le 等运算符只能用于数字比较 > ,< 等可用于数字也可用于字符串,用于字符串的时候,根据 ascall 码的顺序

小数运算 bc

在使用'除法'时,需要指定小数点精度,否则运算结果中不会包含小数,使用scale指定小数点精度

  #4.54
  echo  "scale=2; 10/2.2" | bc
  foo=$(echo "scale=2; 10/2.2" | bc )
  # 4.54
  echo $foo

整数运算

(()) 和 let 只能用于整数 let 不能用于逻辑运算

  #0 (()),可以执行多个运算表达式,以最后一个作为返回值
  echo $((2>1,1>2))
  
  # a=$((1+2))
  $((a=1+2))
  echo $a

整数相等或不等(()), []

  # 输出 yes
  f1=1
  f2=2

  #-------相等
  # if[ $f1 == $f2 ]
  # if [ $f1 -eq $f2 ]
  if ((f2 == f1))
  then
    echo "yes =="
  else
    echo "no =="
  fi

  # if[ $f1 != $f2 ] 
  # if [ $f1 -nq $f2 ]
  if ((f2 != f1))
  then
    echo "yes !="
  else
    echo "no !="
  fi

整数大于,小于(()), [],[[]]

    f1=2222
    f2=222
    # if [[ $f1 > $f2 ]]
    # if [ $f1 \> $f2 ]  要转义 >
    # if [ $f1 -gt $f2 ]
    if (( f1 > f2 ))
    then
        echo "yes >"
    else
        echo "no >"
    fi

直接定义整数进行计算 declare -i 并不能正真定义整数变更,只是方便进行计算而已

  declare -i  foo
  foo=1+9
  # 10
  echo $foo

字符串运算

  1. 字符串相等或不等比较 []
  f1=a1
  f1=a1
  if [ $f1 == $f2 ]
  then
    echo "yes =="
  else
    echo "no =="
  fi
  
  if [ $f1 != $f2 ]
  then
    echo "yes !="
  else
    echo "no !="
  fi
  1. 字符串大于,小于[],[[]],比较的是 ascall 码的和
 f1=a
 f2=b
 # if [ $f1 \> $f2 ] 需要转义
 if [[ $f1 > $f2 ]]
 then
 echo "yes >"
 else
 echo "no >"
 fi
  1. 字符串长度及存在判断 [],[[]]
  • -n 字符串长度不等于0为真 (not zero)
  • -z 字符串长度等于0为真 (zero)

[] 内变量需要加 " " 包围变量 [[]] 内的变量不需要包围

    f1=0
    f2=""
    f3="0"

    #
    [ -n "$f1" ] && echo yes  -n f1 # yes -n f1

    [ -n "$f2" ] && echo yes  -n f2

    [ -n "$f3" ] && echo yes  -n f3 # yes -n f3

    #
    [[ -z $f1 ]] && echo yes  -z f1 

    [[ -z $f2 ]] && echo yes  -z f2 # yes -z f2

    [[ -z $f3 ]] && echo yes  -z f3  

    # 存在判断 可以取反 [ !"$f1" ]
    [[ $f1 ]] && echo yes  exist f1 # yes exist f1

    [[ $f2 ]] && echo yes  exist f2 

    [[ $f3 ]] && echo yes  exist f3 # yes exist f3

文件判断

测试符 描述 示例
-e 文件或目录存在 [ -e "/root/a.txt" ]
-f 文件存在
-d 目录存在
-r 有读取权限
-w 有写入权限
-x 有执行权限
-s 文件存在并且size>0

逻辑运算符 && ||

[[]] 内只能使用 && , || [] 内只能使用 -a,-o [],[[]] 之外只能使用 && ,||

  • ! 非运算
  • -a 与运算
  • && 带短路功能的与运算
  • -o 或运算
  • || 带短路功能的或运算

test 运算

test 运算符不好用 可以用 [[]] 或 [] 代替

  foo=1
  bar=2
  test $foo -eq $bar && echo foo==bar
  test $foo ==  $bar  &&  echo foo==bar

语句

if

  # 方法1
  if 1>2
  then
    echo ""
  fi
  
  # 方法2
  if 1>2
  then
    echo ""
  else
    echo ""
  fi

  # 方法3
  if 1>2
  then
    echo ""
  elif 3>4
    echo ""
  then
    echo ""
  else
     echo ""
  fi

for

  for  i in a b c 
  do 
    echo $i
  done

while while: 或 while true 代笔无限循环 until 和 while 相反

  while 1==1
  do
   echo ""
  done

case 匹配 case 开始 esac 结束

  echo "输入数字"
  read foo
  case $foo in
        1) echo "1"
        2) echo "2"
  esac 

break , continue 和java 用法一致

函数

函数 定义类似 js,function 打头 返回值用 return 如下脚本定义了一个函数 fun 函数定义处不能写参数

  1. 位置参数 内部用$0 到 $9 接受参数, $@ 或 $* 一次性接受所有参数,$# 代表参数的个数

        function fun(){
          return $[$1+$2]
        }
        # 调用函数
        fun 1 2
        # 获取函数返回值
        foo=$?
        echo $foo
        #脚本的返回值
        exit $foo
    

参数左移

  function fun(){
      # 判断函数的参数个数
      while [$# !=0 ] 
      do
        echo $1
        #对参数进行左移
        shift
      done
  }
  # 调用函数
  fun 1 2
  # 获取函数返回值
  foo=$?
  echo $foo
  #脚本的返回值
  exit $foo

磁盘管理

df # df -h # 百分比显示 du -a # 查看目录内的文件磁盘占用率 du -sm # 查看目录内汇总

进程

  # 查看进程
  ps  
  # 查看进程树
  pstree -p
  # 查看 cpu 负载
  top 

alias 别名

alias 是临时的,在当前 shell 进程有效,当前 shell 进程退出,别名就消失了 列出当前 shell 进程的所有别名

  # wd 就可以代替 'cd /home/wind/data'
  alias wd='cd /home/wind/data'

在用户 wind 的 /home/wind/.bashrc 文件内加入 alias wd='cd /home/wind/data' 就可以永久保存这条命令了

read 读取命令

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向
默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据

vim

wq 保存退出 q! 不保存强制退出 q 在没有修改的情况下直接退出 : 进入命令行模式 i 进入编辑模式

👍🎉🎊