一些认知
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才可以看到
- 查看当前绝对路径 pwd
-
相对路径 && 特殊目录 . 和 ..
在每个目录下,都会固定存在两个特殊目录,分别是一个点(.)和两个点(..)的目录。
- 一个点(.)代表的是当前目录
- 两个点(..)代表的是当前目录的上层目录
目录的常用操作
cd 该命令是change directory的简写,切换工作目录
- mkdir -p 创建目录 -p 表示目录不存在就创建一个
- mkdir -p newDir 创建一层目录
- mkdir -p newDir1/newDir2 创建多层目录
- mkdir -p newDir1/{newDir11,newDir12} 创建newDir1及在其下在创建俩个子目录newDir11,newDir12
- rmdir rm 删除目录
- rmdir 只能删除空目录 一次只能删除一层目录,并且是空目录
- rm -r 递归删除目录内的所有文件及子目录及文件,最后删除目录,每一次删除都要确认
- rm -rf 强制删除目录内的所有文件及子目录及文件并不进行提示
- rm -rfv 强制删除目录内的所有文件及子目录及文件有提升
-
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进行配置时,在很大程度上就是处理文件的过程
- touch fileName 创建文件,如果已经存在同名文件,就修改文件的创建时间,不会修改文件的内容
- rm fileName
- mv 移动或重命名文件 mv 后跟俩个参数
- 如果第二个参数是目录代表是移动文件,移动后源目录的文件会被删除 移动文件的时候也可以重命名文,目录后跟一个文件名
- 如果第二个参数是文件代表的是重命名文件
- cat 该命令是concatenate的简写,用户查看文件的全部内容 cat -n 有行号 cat a.txt b.txt >> c.txt 把 a.txt b.txt 的内容追加到 c.txt cat a.txt | cmd 把 a.txt 做为cmd 的参数
- head -n 20 查看文件的指定的前20行内容, 不使用 -n 默认查看前10行
- tail 查看文件的后几行用法和 head 一样
- dos2unix 把 windows 文件转换为 unix 格式的文件,因为俩种系统的换行符不一致
- file fileName 显示文件类型
- less 打开新窗口查看文件,可以通过方向箭头翻页,q 键退出
- 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
注意点
- 命令分俩种 内置命令和外部命令(外部程序),内部命令常驻内存执行快,通过 type 命令 测试命令类型 type -a 查看命令的所有定义 type -t 查看命令的类型
- exit 返回值 不是用 return
- 命令参数有长,短区分,--reverse 是长参数 -r 是短形式
- 多个命令一起执行用 ; 隔开
常用的关键字如下:
-
echo:打印文字到屏幕
echo 默认是输出一行文本,如果要输出多行文本用 " " 包围多行文本 echo 默认换行,如果不要换行,增加参数 -n echo 默认会把字符原样输出 -e 会对转义字符进行处理 \n 等 -
exec:执行另一个 Shell 脚本
-
read:读标准输入
-
expr:对整数型变量进行算术运算
-
test:用于测试变量是否相等、 是否为空、文件类型等
-
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
字符串运算
- 字符串相等或不等比较 []
f1=a1
f1=a1
if [ $f1 == $f2 ]
then
echo "yes =="
else
echo "no =="
fi
if [ $f1 != $f2 ]
then
echo "yes !="
else
echo "no !="
fi
- 字符串大于,小于[],[[]],比较的是 ascall 码的和
f1=a
f2=b
# if [ $f1 \> $f2 ] 需要转义
if [[ $f1 > $f2 ]]
then
echo "yes >"
else
echo "no >"
fi
- 字符串长度及存在判断 [],[[]]
- -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 函数定义处不能写参数
-
位置参数 内部用$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 进入编辑模式