大家好,又见面了,我是你们的朋友全栈君。
目录
一、基本 bash shell命令
二、更多shell命令
三、理解Shell
四、Linux环境变量
全局变量
局部变量
五、Linux文件权限
六、管理文件系统
七、安装软件程序
八、构建基本脚本
重定向
管道( | )
执行数学运算
退出脚本
九、使用结构化命令
if语句
test命令
数值比较和字符串比较
文件检查
复合条件测试
if-then 高级特性
case命令
十、更多结构化命令
for命令
while命令
until命令
其他知识:
一、基本 bash shell命令
创建文件 : touch
链接文件:符号链接:是一个实实在在的文件,两个通过符号链接在一起的文件,彼此的内容并不相同。使用ln -s命令。
硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但他们从根本上而言是同一个文件。原始文件必须事先存在,使用ln命令。
查看文件类型 : file
查看整个文件 : cat , more , less
查看部分文件 : tail , head
二、更多shell命令
探查进程 : ps , 常用 ps -ef , ps -l
实时监测进程 : top。第一部分显示系统的概况:第一行显示当前时间、系统运行时间、登录的用户数以及系统的平均负载(三个值代表最近1min、5min、15min)如果近15min内的平均负载都很高,说明系统可能有问题。
第二行显示了进程概要信息:有多少进程处在运行、休眠、停止或是僵化状态
下一行显示了CPU的概要信息。
紧跟其后的两行说明了系统内存的状态。第一行是系统的物理内存:总共多少内存,当前用了多少,还有多少。后一行表示同样的信息,不过针对系统交换空间。
最后一行显示当前运行中的进程纤细列表。
PID:进程ID; USER:进程属主名字; PR:进程优先级; NI:进程的谦让值; VIRT:进程占用的虚拟内存总量; RES:进程占用物理内存总量; SHR:进程和其他进程共享的内存总量; S:进程的状态(D可中断休眠,R运行,S休眠,T跟踪或停止,Z僵化); %CPU:进程使用CPU时间比例; %MEM:进程使用的内存占用内存的比例; TIME :自进程启动到目前位置的CPU时间总量; COMMAND:进程对应的命令行名称。
结束进程 : kill , killall
挂载存储媒体: mount
移除存储媒体: umount
查看所有已挂载的磁盘 : df
显示特定目录的磁盘使用情况 : du
排序数据 : sort
搜索数据 : grep
压缩数据 : bzip2(.bz2) , compress(.Z) , gzip(.gz) , zip(.zip) 。只能压缩单个文件或者某个目录中的文件,或者是能有通用符表示的多个文件。
归档数据 : tar (将多个文件归档进单个文件)
三、理解Shell
进程列表 : 将命令列表包含在括号中 , 如 :( pwd ; ls ; cd /etc; pwd; cd ; pwd; ls)会创建一个子shell来执行命令。
后台模式 : 在命令结尾加上字符 & ,如 sleep 3000 &
协程 : 在后台生成一个子shell,并在这个shell中执行命令 ,如 : coproc my_job { slee 10; }。
外部命令 : 也称为文件命令,存在于bash shell 之外的程序,当外部命令执行时,会创建一个子进程。
内建命令 : 不需要使用子进程来执行,执行速度更快
命名别名 : alias li=’ls -li’,仅在它所被定义的shell进程中才有效。可以将alias设置放在$HOME/.bashrc文件中,使其效果永久化。
四、Linux环境变量
全局变量
查看全局变量: printenv 或者 env,查看某一个环境变量printenv ,如: printenv PATH,或者echo,如: echo $PATH. 设置全局变量时,可以先创建一个局部变量,然后再使用export将其导出为全局变量。如 : export my_variable. 子shell不能改变父shell中的全局变量,即使使用export命令。
局部变量
查看局部变量: set命令会显示为某个特定进程设置的所有环境变量,包括局部、全局和用户定义变量。
设置用户变量: my_variable=”Hello world”,该变量在子shell中无效。数组变量mytest=(one two three four five),输出所有的值echo ${mytest[*]},输出单个值 echo ${mytest[2]},可以使用unset删除数组中的某个值,但是只会使该索引上的值为空。素组变量在shell脚本编程时并不常用,它的可移植性不好。
删除环境变量 : unset my_variable。如果该变量是全局变量,且在子shell中删除了该变量,在父shell中该变量依然可用。
设置PATH变量 : PATH=$PATH:/home/christine/Scripts 。 只能持续到退出或者重启系统。
环境变量的定位 : 登录时作为默认登录shell的启动文件为/etc/profile, 作为非登录shell的交互式shell(如在命令行敲入bash时启动),它不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。 非交互式shell使用的BASH_ENV环境变量,它可以继承父shell导出过的变量,使用当前shell的局部变量和全局变量。
环境变量持久化 : 在/etc/profile.d 目录中创建一个以.sh结尾的文件。把所有新的或者修改过的全局变量设置放在这个文件夹中。
五、Linux文件权限
/etc/passwd文件 :
登录用户名: 用户密码: 用户账户UID(数字形式):用户帐号组ID(GID数字形式): 用户账户的文本描述(备注字段): 用户HOME目录的位置: 用户默认shell
/etc/shadow文件 : 只有root用户可以访问。
登录名: 加密后的密码: 自上次修改密码后过去的天数(自1970年1月1日开始): 多少天后才能修改密码: 多少天后必须更改密码: 密码过期前多少天提醒用户更改密码: 密码过期后多少天禁用用户账户: 用户账户被禁用的日期(自1970年1月1日到当天的天数): 预留字段
添加新用户: useradd
删除用户 : userdel
修改用户 : usermod(修改用户账户字段,可以制定主要组以及附加组的所属关系), passwd(修改已有用户的密码), chpasswd(从文件中读取登录名密码对,并更新密码), chage(修改密码的过期日期), chfn(修改用户账户的备注信息), chsh(修改用户的默认登录shell)
/etc/group文件 : 文件格式 : 组名: 组密码: GID: 属于改组的用户列表
创建组 : groupadd
修改组 : groupmod
文件权限 : 例 lrwxrwxrwx 1 root root 6 Oct 3 03:54 link_nusers -> nusers
第一个字符代表了对象类型 : -代表文件, d代表目录, l代表链接, c代表字符型设备, b代表块设备, n代表网络设备。3组3字符编码分别代表了对象的属主、对象的属组、系统其他用户的权限,r可读,w可写,x可执行,其中-是0,x是1,w是2,r是4。文件的全权限值是666,目录是777.umask值是掩码值,需要从对象的全权限值中减去,即666-022=644。
chmod 760 myfiles或者 chmod [ugoa…] [ -=] [rwxXstugo…]
u代表用户,g代表组,o代表其他,a代表上述所有。
表示在现有权限基础上增加权限,-表示在现有权限上移除权限,=表示将权限设置成后面的值
X如果对象是目录或者它已有执行权限,赋予执行权限; s运行时重新设置UID或GID; t保留文件或目录; u将权限设置为属主一样; g将权限设置为跟属组一样; o将权限设置为跟其他用户一样。
改变所属关系 : chown 改变文件的属主。 chgrp改变文件的默认属组。
共享文件(某一个组内的所有用户):
代码语言:javascript复制mkdir testdir ##创建共享目录
chgrp shared testdir #改变目录所在组
chmod g s testdir #在属组的权限上增加运行时重新设置UID或者GID
umask 002 #设置文件对属组可写
cd testdir ; touch testfile #进入目录创建文件
六、管理文件系统
创建分区 : fdisk
创建文件系统(格式化) : mkfs.vfat(格式化u盘,文件系统fat), mkfs.ext3(文件系统ext3)
七、安装软件程序
使用aptitude 管理软件包
在命令行输入aptitude
快速显示某个特定包的详细信息 aptitude show package_name
得到特定软件包相关的所有文件的列表 dpkg -L pageage_name
找到特定的软件包 aptitude search package_name
安装软件包 aptitude install package_name
更新软件 aptitude safe-upgrade
卸载软件 aptitude purge package_name 或 aptitude remove package_name
区别remove选项不删除数据和配置文件,purge会删除全部。
八、构建基本脚本
创建shell脚本文件
格式一般为 : #! /bin/bash
环境变量: 在变量名前加美元符($)来使用这些环境变量。
用户变量: var1=10,用户变量可通过美元符引用,在shell脚本结束时会被删除掉。
命令替换:将命令输出赋给变量:反引号字符(`)或者$()
重定向
输出重定向 : >(写入文件) , >>(追加)
输入重定向 : <(基本输入) , <<(内联输入重定向)
管道( | )
将一个命令的输出作为另外一个命令的输入,如 ls -l | more
执行数学运算
expr命令 : expr 1 * 2 , expr 1 5
使用放括号 : var1=$[1 5] var2=$[$var1 * 2]
浮点: 使用bc计算器,设置小数位: scale=4
在脚本中使用bc,基本格式:
variable=$(echo “options; expression” | bc)
在bash计算器中创建的变量只能在bash计算器中有效,不能在shell脚本中使用
退出脚本
查看退出状态码 : $?(0表示默认正常退出)
exit命令:允许在脚本结束时指定一个退出状态码,如 exit 5
九、使用结构化命令
if语句
if语句会运行if后面的那个命令,如果该命令的退出状态码是0,then部分的命令会被执行,如果是其他值,then部分不会被执行
- 基本格式 :
if command1
then
command
fi
- if-then-else语句基本格式:
if command
then command
else command
fi
- 或者 :
if command
then command
elif command
then command
fi
test命令
如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0.如果变量中没有内容,退出状态不为0.基本格式:
test condition
- 在if-then语句中的用法
if test condition
then commands
fi
- 另外一种方法 :
if [ condition ] ####注意空格
then command1
fi
数值比较和字符串比较
代码语言:javascript复制#! /bin/sh
##数值比较
# n1 -eq n2 检查n1是否与n2相等 (equal)
# n1 -ge n2 检查n1是否大于或等于n2 (great equal)
# n1 -gt n2 检查n1是否大于n2 (greater than)
# n1 -le n2 检查n1是否小于或等于n2 (less equal)
# n1 -lt n2 检查n1是否小于n2 (less than)
# n1 -ne n2 检查n1是否不等于n2 (not equal)
##字符串比较
# str1 = str2 检查str1是否与str2相同
# str1 != str2 检查str1是否与str2不同
# str1 < str2 检查str1是否比str2小
# str1 > str2 检查str1是否比str2大
# -n str1 检查str1的长度是否非0
# -z str1 检查str1的长度是否为0
value1=10
value2=a
if [ $value1 -gt 5 ]
then
echo "the test value $value1 is greater than 5"
fi
if [ $value1 < $value2 ] #注意这里需要转义
then
echo "$value1 is less than $value2"
else
echo "$value1 is greater than $value2"
fi
文件检查
代码语言:javascript复制 #! /bin/bash
##文件比较
# -d file 检查file是否存在并是一个目录
# -e file 检查file是否存在
# -f file 检查file是否存在并是一个文件
# -r file 检查file是否存在并可读
# -s file 检查file是否存在并非空
# -w file 检查file是否存在并可写
# -x file 检查file是否存在并可执行
# -O file 检查file是否存在并属当前用户所有
# -G file 检查file是否存在并且默认组与当前用户相同
# file1 -nt file2 检查file1是否比file2新
# file1 -ot file2 检查file1是否比file2旧
```
```
file=/root/Desktop/Scripts
if [ -d $file ]
then
echo "this is a directory"
fi
复合条件测试
[ condition1 ] && [ condition2 ] ## 逻辑与
[ condition1 ] || [ condition2 ] ## 逻辑或
if-then 高级特性
用于数学表达式的双括号用于高级字符串处理功能的双方括号
代码语言:javascript复制#!/bin/bash
##双括号命令符号
# val 后增, val-- 后减, val 先增, --val 先减
# ! 逻辑求反, ~ 位求反, ** 幂运算, << 位左移
# >> 位右移, & 位布尔和, | 位布尔或, && 逻辑和, || 逻辑或
##双方括号 [[ expression ]]
# expression使用test命令中采用的标准字符串比较,同时还提供了模式匹配
var1=4
var2=3
((var3=$var1 & $var2))
if [ $var3=0 ]
then
echo "$var1 & $var2 is equal 0 "
fi
if [[ $USER == r* ]]
then
echo "Hello $USER"
fi
case命令
在一组可能的值中寻找特定值(相当于switch)
- 基本格式
case variable in
pattern1 | patter2) command1;;
pattern3) command2;;
*) default commands;;
easc
代码语言:javascript复制#!/bin/bash
case $USER in
root | barbara)
echo "Welcome, $USER"
echo "Please enjou you visit";;
testing)
echo "Special testing account";;
*)
echo "sorry,you're not allowed here";;
esac
十、更多结构化命令
for命令
- 基本格式 :
for var in list
do
commands
done
代码语言:javascript复制#! /bin/bash
##读取列表中的值
# list="Alabama Alaska Arizona"
## 读取复杂值
# list="I don't know if this'll work" #单引号转义
## 从变量读取列表
# list="Alabama Alaska Arizona"
# list=$list "Connecticut" # list="Alabama Alaska Arizona Connecticut"
## 从命令读取值
# list="/root/Desktop/Scripts/state"
# for state in $(cat $list)
## 更改字段分割符
# 默认分割符 : 空格、制表符、换行符
# 更改IFS的值: IFS=$'n',只能识别换行符
## 用通配符读取目录
# for file in /root/Desktop/Scripts/*
代码语言:javascript复制# example1:
file=state
IFS=$'n'
for state in $(cat $file)
do
echo "$state"
done
# example2:
for (( a=1,b=10 ; a<=10 ; a ,b--))
do
echo "$a-$b"
done
- C语言风格for命令格式 :
for (( variable assignment ; condition ; iter))
while命令
它会在每次迭代的一开始测试test命令,在test命令返回非零退出状态码时,while命令会停止执行。格式 :
代码语言:javascript复制while test_command
do
other commands
done
代码语言:javascript复制#!/bin/bash
## 在while中可以使用多个测试命令
var1=10
while echo $var1 ##第一个测试命令
[ $var1 -ge 0 ] ##第二个测试命令
do
echo "This is inside the loop"
var1=$[ $var1 - 1 ]
done
until命令
和while命令工作方式完全相反,until命令要求你制定一个通常返回非零推出状态码的测试命令,只有测试命令的退出状态码不为0,才会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环结束。基本格式:
代码语言:javascript复制until test_command
do
other commands
done
用法同while相同。
其他知识:
代码语言:javascript复制#! /bin/bash
## 循环文件处理
IFS.OLD=$IFS ##保存IFS值
IFS=$'n'
for entry in $(cat /etc/passwd)
do
echo "Values in $entry -"
IFS=:
for value in $entry
do
echo " $value"
done
done
代码语言:javascript复制## break n: 命令可以跳出内部和外部循环,n默认为1,表示跳出当前循环,如果将n设为2,break命令会停止下一级的外部循环
## continue n: 命令允许通过命令行参数指定要继续执行哪一级循环
## 处理循环输出: 可以对循环的输出使用管道或进行重定向,这可以通过在done命令后添加一个处理命令来实现
for file in /root/Desktop/Scripts/*
do
if [ -f "$file" ]
then
echo "$file is a file"
fi
done > output.txt
# done | sort > output.txt
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188594.html原文链接:https://javaforall.cn