shell

Posted tujw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell相关的知识,希望对你有一定的参考价值。

当前目录所有目录中的文件

ls -R

显示目录和文件,目录后带/

ls -F

递归复制整个文件夹

cp -R

重命名文件

mv node.sh note.sh

硬连接会保留数据,软连接会直接无效

cp -l # 硬连接
cp -s # 软连接

创建目录

mkdir dir

查看文件内容 -n所有行号 -b带文本的行号

cat

其他查看文件的方法

more less

显示开头和结尾 可以带 -n 显示n行

head tail

显示进程

ps

实时进程控制

top

停止进程

kill

查看磁盘空间 -c 显示总用量 -h 以可读形式显示

df

对文件内容进行排序 -n 数字识别为数字 -M 按月份排序

sort file -n

查看全局变量

printenv

设置本地变量,然后导出,就可以变为全局变量

导出后不用再使用$符号

var=100
export var

删除环境变量

unset var

定义数组

myArr=(1 2 3 4)

通用显示

echo ${myArr[0]}

只能显示第一个

echo $myArr

显示所有数据

echo ${myArr[*]}

unset 对数组也有效

查看别名

alias -p

创建别名

alias vim=‘vi‘

用户操作

useradd usermod userdel

修改权限 u 表示用户 o 表示其他任何人

g 表示用户组 a 表示所有

+ 表示增加权限 - 相反

x 表示执行权限 chmod u+x file

上述命令表示给文件增加执行权限

chmod

开始创建脚本

!/bin/bash

执行该 echo 后不换行

echo -n

时间

date

用户

who

不管文件村不存在,都覆盖

data > file

>> 在末尾添加

wc 文本的行数,文本的单词数,文本的字节数

管道符 ,将输出重定向到另一个命令

|

运算,$[],在方括号中进行

a=10
b=20
c=$[a+b]
echo c

bc bash计算器

-q 去掉欢迎 scale 设置小数位数

bc

浮点数运算,一定要用双引号,外面用1左边的引号

a=100.1
b=150
c=echo "scale=4; $a / $b" | bc
echo $c

内置输入重定向

result=bc << EOF scale=10 a=100 b=2300 a/b EOF

查看退出状态码

echo $?

手动修改状态码

exit 10

结构化命令,如果if后的命令执行返回0

那么执行then后面的语句

if date
then
echo "It‘s worked"
fi

可以在then语句块后加else

elif 多分支语句

if 条件中可以写这个,

和普通就一样了

需要注意的是要和[ 空格分开 ]

-eq 相等

-ge 大于等于

-gt 大于

-le 小于等于

-lt 小于

-ne 不等于

test不能处理浮点数

[ 1 -eq 2 ]

测试 test

test condition

字符串比较 = != < > -n -z

-n 长度是否大于0

-z 是否长度为0

比较时要注意要用转译符转译

字符串比较 -n "$str"

后面一定要加"",否则会出错

-d 是否是目录

-e 是否存在

-f 是否存在且是一个文件

-r 是否存在且可读

-s 是否存在且不为空

-w 是否存在且可写

-x 是否存在且可执行

-O 是否被当前用户拥有

-G 默认组是否为当前用户组

file1是否比fil2新

file1 -nt file2

-ot 旧

if 后面可以加 && ||

(())中可以执行个一些较高级的操作

里面符号也不需要转译

((a++)) ((a=!a))

[[]]内可以使用正则表达式去匹配

对前面的变量进行匹配

me=tujiawei
if [[ $me == t* ]]
then
echo $me
else
echo no
fi

case 命令

case $var in
var1 | var3)
echo $var;;
var2)
echo $var;;

*)
echo 这是默认;;
esac

for循环

for i in list
do
echo commands
done

赋值

list=‘123123‘
list=$list"456"
echo list

internal field separator 内部字段分隔符

下面的意思是只识别换行符和空格

IFS=$‘ ‘

如果只有单个 可以

IFS=:

linux中文件名带空格是合法的

在使用时最好用""包裹

类似c的for

for ((i=1,j=10; i<=10; i++, j--))
do
echo next number is $i - $j
done

while 循环

只有最后一条测试命令的退出状态

是用来决定循环何时停止的

cnt=10
while [ $cnt -gt 0 ]
do
echo $cnt
((cnt--))
done

while 可以写多个条件

每个条件要换行

只有最后一条测试的退出状态是有效的

until 与 while 相反

只有最后一条测试命令的退出状态非0才执行

break continue

在 done 后面可以加 > 将结果输出 >>

还可以将循环的输出管道传送给其他命令

$0 为程序名

$1 - $9 为程序的参数

超过9以后,需要使用 ${10} .. ${11}

basename 返回名称,不带路径

$# 输入参数的个数

${!#} 获取最后一个输入的参数,不能用 ${$#}

$* $@ 将所有参数作为一个字符串

shift 将参数左移, 后面可以加数字, 左移n位

getopt 接受选项和参数列表

后接选项,如 abc

如果选项需要参数,就在选项后加个:

如 a: ,表示 -a 后面需要加参数

set -- 将命令行参数替换为 -- 后面的值

set -- getopt ab:cd "$@" 拆分命令行参数,并修改命令行参数

getopt ab:cd "$@" 将命令行参数变为单独的

如 -ab 变为 -a -b

这种方法会将双引号中带空格的一个命令拆分为多个

处理参数

??c 第一个:表示禁止警告信息

当没有在??c中出现时,会将选项变成?

如果不是以-开头会停止解析

while getopts ??c opt
do
case "$opt" in
a)
echo "Found the -a option" ;;
b)
echo "Found the -b option, with value $OPTARG" ;;
*)
echo "Unknow option : $opt" ;;
esac
done

最后停止的位置

$OPTIND

选项的参数

$OPTAGR

-a 显示所有对象
-c 生成计数
-d 指定目录
-e 展开对象
-f 制定读取数据的文件
-h 显示帮助
-i 忽略大小写
-l 生成长格式输出
-n 非交互式模式
-o 指定输出文件
-q quiet模式执行
-r -r 递归处理目录和文件
-s 以silent模式执行
-v 生成verbose输出
-x 排除和拒绝
-y 设置所有提问的回答为yes

读取用户输入

read var

echo -n 抑制换行

输入提示, 可以输入多个

如果不指定变量,会放在 $REPLY

read -p "请输入姓名:" name age

在read 后加 -t n 定时

read -t 5

5秒后自动结束 , 返回一个非0退出状态

read -n1 只接受一个字符

-s 让输入不显示

read 按行读文件

count=1
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished processing the file"

ls -al badfile 2> test1

2>表示输出错误信息

STDIN 0
STDOUT 1
STDERR 2

&> 将普通信息和错误信息输出到同一个文件中

默认情况下,Linux将 STDOUT输出定向到STDOUT

>&2 在脚本中重定向输出

正常运行不会有效果,只有运行脚本时,加上 2> 才会有效果

永久重定向

将所有STDOUT重定向到 file

exec 1>file

把3重定向到监视器

把1重定向到文件

结束以后把1改回到监视器

exec 3>&1
exec 1>output

exec 1>&3

改输入时使用 <

关闭文件描述符 , 重定向到 -

3>&-

禁止命令输出

/dev/null

mktemp 在/tmp 目录创建临时目录

生成随即字符, 一定要大写X

mktemp test.XXXXXX

mktemp -t 强制创建临时文件,并返回全路径

-d 强制创建临时目录,并返回全路径

同时发送给 监视器 日志文件

每次写都会覆盖之前的内容

若想添加, -a

tee file

date | tee -a file
SIGHUP 刮起进程
SIGINT 中断进程
SIGQUIT 停止进程
SIGKILL 无条件终止进程
SIGTERM 如果可能的话终止进程
SIGSTOP 无条件停止
SIGTSTP 停止或暂停
SIGCONT 重新启动停止进程

sleep n 暂停n秒

ctrl+z 暂停进程

当接受到信号时 执行trap 后面的命令

下面的命令表示要中断进程时 显示Haha

trap "echo Haha" SIGINT SIGTERM
trap "Bye-bye" EXIT

trap - EXIT 移除捕获

在后台运行 ./demo.sh &

在后面加一个 & 就可以

防止退出中断时退出进程

nohup ./demo.sh &

$$表示分配给作业的PID

jobs # 显示作业

-l 进程的PID和作业编号
-n 仅列出自上一次shell通知以来已经更改了作业的状态
-p 只显示PID
-r 只显示运行的作业
-s 只显示停止的作业

  • 为默认作业
  • 为处理完当前默认作业之后将成为默认作业
    只会有一个 + 和 -

bg n 后台模式重新启动作业

fg n 前台模式重新启动作业

前台模式下无法使用命令行

优先级为10运行该脚本

-20 ~ 20 其中-20优先级最高

只能将优先级变小,不能增加

nice -n 10 ./demo.sh > test &

renice 更改系统中运行的命令优先级

renice 10 -p PID号

指定时间运行脚本

at [-f filename] time

time 可以用 Now, Now + n minutes, 10:20, 10:20PM

MMDDYY MM/DD/YY 或 DD.MM.YY

-q 指定优先级 a最高 z最低

atq 查看作业队列
atrm 移除作业

batch 如果平均负载低于0.8

运行等待的作业

与at类似

batch -f file time

min hour dayofmonth month dayofweek command

不想写可以用 * 号代替

anacron 能将错误运行时间的命令尽快运行

period delay identifier command

多久运行一次 确定运行后,需多长时间才会实际运行

唯一标识日志消息和错误消息

function name {
commands
}

name() {

}

name

可以使用return 0 ~ 255

在函数内部使用echo 返回给result

result = funcname
可以返回浮点数 和 字符串

函数就是一个小脚本,所以脚本的 $0 ~ $9 同样适用
func 10 20

local 函数内部定义局部变量
local a=1

est ${arr[*]} 传递数组

. /home/function
运行库文件脚本,可以使用相对路径

可以在 .bashrc 文件中定义函数

echo -e " " 可以输出不可打印的字符

选项菜单 其中 hello greet bye 都是函数
PS3="Enter option:"
select option in "hello" "greet" "exit"
do
case $option in
"hello")
hello ;;
"greet")
greet ;;
"exit")
bye
break ;;
esac
done

控制序列指示器

CSI

选择图形再现

SGR

CSIN[;k]m
普通
强亮
弱亮
斜体
下划线
慢闪烁
快闪烁
背景/前景色反转
将前景色改为背景色
黑色
红色
绿色
黄色
蓝色
洋红
青色
白色

CSI用33代替
echo -e "33[30m 黑色字 33[0m"
[后是颜色代码,前景色以3开头加颜色
背景色以4开头
要使用斜体等的 [ 后 一个数字
最后都要用m结尾

替换test 为big test

"This is a test" | sed ‘s/test/big test/‘

sed 不会修改原文件,只会STDOUT
-f file
-e script
-n 禁止sed输出
sed -e ‘s/test/big test/; s/a/2‘ data1
执行多条命令用 -e, 必须用 ; 隔开
/; 不能有空格

在script中:
s/test/test1/
s/tes/test/
s/pattern/replacement/flags

flag 可以是
数字 表示第几次出现 2 表示替换掉第二次出现的字符
g 替换全部,默认只替换一行中的第一个
p 打印原始内容
w file 将替换结果写入file

可以使用!来代替/ 使更容易更换路径

2/dog/cat/ 只修改第二行
2,3 修改2,3行

2,$ 2 ~ 最后一行

sed 2,$d data 删除第二行到最后一行

可以用正则表达式

command 可以用a 和 i 类似 vim
sed ‘[address]command?new line‘

df 磁盘空间

at 定时任务创建

at 00:00

按下ctrl + D 结束命令

任务只会执行一次

创建定时任务,周期执行

crontab -e 

创建任务后按提示操作

# 每月的1、2、3号执行任务
1 1 1,2,3 * * commond

# 每隔5分钟执行一次任务
*/5 * * * * * commond

anacron

错过任务执行时间后

不执行cron计划任务

机器启动后,侦测有没有cron没有执行的任务

如果有,开机后立即执行

多命令协作

管道

将一个命令的STDOUT作为另一个命令的STDIN ==> |

重定向

  • 将STDOUT重定向到文件
    • 覆盖 >
    • 追加 >>
  • 将STDERR重定向到文件
    • 2>
    • 将STDERR与STDOUT结合 2>&1
  • 重定向STDIN
    +?

数据流

命令通过STDIN接收参数或数据
通过STDOUT输出结果
通过STDERR输出错误

STDIN

标准输入
默认从键盘输入
编号 0

STDOUT

标准输出
默认终端
编号1

STDERR

标准错误
默认终端
编号2

文件系统

  • 文件系统为一个倒转的单根树状结构
  • 文件名最长255个字符
  • 除了/ 其他都可以用

  • .开头的文隐藏文件 => .git
  • 隐藏文件一般为配置文件

  • 文件颜色
    • 蓝 => 目录
    • 黑 => 文件
    • 浅蓝 => 链接
    • 红 => 压缩包
    • 绿 => 可执行文件
    • 黑底黄字 => 设备文件
  • pwd 查看工作目录

  • touch 创建文件

  • cut 按指定字符分割
    • -d 指定字符串分割
    • -d: 按: 进行分割
    • -f 指定输出的序号
    • -f1 只输出第一列
    • -c 基于字符分割
    • c4-6 只显示第四个到第六个字符
    • echo ‘tu:jia:wei‘ | cut -d: -f1
    • echo ‘tu:jia:wei‘ | cut -c4-6
  • cp 复制文件
    • cp filename1 filename2
    • -R 递归复制,可以复制整个文件夹
  • diff 比较两个文件的区别
    • diff file1 file2
    • -i 忽略大小写
    • -b 忽略空格变化
    • -u 统一显示比较信息
    • 一般用以生成补丁文件 .patch
  • file 查看文件详细信息

  • aspell.sh 拼写检查,只能检查英文
    • aspell check file
    • aspell list < file
  • cat 查看文件
    • -n 带行号显示
    • -b 去除空白行
  • 查找文件、文件夹
    • find 查找位置 查找参数
    • find . -name "a*" -exec ls -l {} ;
    • -name 根据名字查找
    • -perm 根据权限 -perm 777
    • -type 根据类型 d 目录
    • 查找所有以a开头的文件
    • 文件名作为参数传给后面的命令
    • 放入{}中
    • 需要注意后面的 ; 不能少
  • which 查看可执行文件的位置

  • whereis 查看可执行文件的位置及相关文件

  • grep 搜索纯文本
    • grep ‘reg‘ file
    • 可以通过管道符来作为输入
    • ls -l | grep ‘grep‘
    • -i 忽略大小写
    • -n 显示所在行数
    • -v 输出不带关键字的行
    • -Ax 在输出的时候显示所在行之后的x行数 After
    • -Bx 在输出的时候显示所在行之前的x行数 Before
  • head 显示开头
    • head filename
    • -n num 显示开头 num 行
  • locate 快速查找文件、文件夹
    • locale key
    • 需要预先建立数据库
    • 默认每天更新一次
    • updatedb 手工建立、跟新数据库
    • 如果新文件没有跟新
    • 可能查不到
  • iconv 转换文件编码格式
    • iconv -f gb2312 -t utf8 filename -o outfile
  • ls 显示文件或目录
    • -R 查看所有目录中的文件
    • -F 显示目录和文件,目录后带 /
    • -ld 现实目标目录的信息及链接信息
    • lspic 查看pci设备 -v 查看详细信息
    • lsusb 查看usb设备 -v 查看详细信息
    • lsmod 查看加载的模块(驱动)
  • less 翻页显示文件内容

  • mkdir 创建目录
    • mkdir dir
    • -p 如果上级目录不存在
    • 则创建上级目录
    • 删除目录
    • 不能删除非空文件夹
  • more 翻页显示文件内容
    • more filename
    • 不能向上翻页
  • less 翻页显示文件内容

  • rm 删除文件
    • -i 交互式删除
    • 没删除一个文件都会提示
    • -r 递归删除
    • -f 强制删除
    • 会去掉-i的提示
  • mv 移动文件命令
    • mv filename1 filename2
    • -l 硬连接: 原文件的引用
    • -s 软连接: 相当于快捷键
    • cp -l <==> ln
  • sort 排序
    • ls | sort
    • sort file
    • -u 去掉重复行
    • -r 倒序
    • -n 基于数字
    • -t c 使用c作为分隔符
    • -k x 当进行基于指定字符分割为列的排序时
    • 指定基于那个列排序
    • | sort 可以直接去重
    • 只能删除相邻的重复行
  • tail 显示最后几行
    • -n num 显示最后 num 行
    • -f 追踪显示文件更新
    • tail filename -f
  • tr 文本转换
    • 删除关键字
    • tr -d ‘word‘ < file
    • 转换大小写
    • tr ‘a-z‘ ‘A-Z‘ < file
  • wc word counter 单词统计
    • ls -l | wc -l
    • -l 只统计行数
    • -w 只统计单词
    • -c 只统计字节数
    • -m 只统计字符数
  • tee 读标准输入 写到标准输出

流程控制

if

如果if后的命令执行返回0
那么执行then后面的语句

if date
then
    echo "It's worked'
fi

if date

then

echo 'It's worker'

fi

运算

  • $[ a + b ]
  • bc bash计算器
    • -q 去掉欢迎
    • scale 设置小数位数
    • 浮点数运算,一定要用双引号,外面用反引号
    • a=100.1
    • b=150
    • c = echo "scale=4; $a / $b" | bc

变量定义

  • 数组
    • arr=(1 2 3)
    • echo ${arr[0]} 通用显示
    • echo $arr 只能显示第一个
    • echo ${arr[*]}显示所有
  • su 切换用户
    • su -
    • -会创建新的环境
    • 不加则不会
  • 切换成管理员权限执行命令
    • sudo commond
  • passwd 修改密码

  • id 获取用户的信息

系统目录

~家目录
-上一个工作目录
cd 直接回车 回到家目录

/ 下文件作用

  • bin 可执行文件
  • boot 引导启动, 内核文件
  • dev 硬件相关文件
  • etc 配置文件
  • home 家目录,存放用户私有数据
  • root root用户的家目录
  • lib 库文件
  • media 自动挂载文件目录
  • mnt 挂载文件
  • opt 一般装大型软件
  • proc 系统实时信息,存在内存中,不在硬盘中
    • 数字对应进程信息
  • sbin 与bin类似,只有管理员权限才能执行
  • sys 底层信息
  • temp 临时信息
  • usr 保存应用软件,默认装在usr
  • var 经常变化的信息

type

  • 可以检测是否是内部命令
    • 如果是外部命令,会直接显示路径

命令

  • date 显示时间
    • 格式化时间
    • %y %m %d
    • 设置时间 -s
    • date +%y-%m-%d
  • hwclock 查看硬件时间

  • cal 查看日历

  • uptime 查看系统运行时间、负载
    • 分别显示1、5、15分钟负载
  • df 查看磁盘空间
    • -h 可读形式显示
  • export 导出全局变量
    • export var
    • 导出后不需要使用$就可以使用
  • hostname 显示用户名

  • unset 删除环境变量
    • unset var
  • printenv 查看全局变量

  • history 查看输入过的命令

  • echo 显示输入内容
    • -n 输出后不换行
  • tar 归档命令
    • tar -cvf filename.tar filename
    • 将文件打包成一个文件
    • -c 创建一个归档
    • 解开归档
    • tar -xvf filename
    • 归档并gzip压缩
    • tar -cvzf file.zip /dir
    • 接压缩并解开归档
    • tar -zxvf file.tar.gz
  • zip 压缩文件
    • zip zipname upzipname
    • 前一个是压缩后的文件名
    • 后一个表示要压缩的文件名
  • unzip 解压缩zip文件
    • unzip filename
  • gzip 直接压缩
    • gzip filename
  • shutdown 关机、重启
    • shutdown -h now
    • -h 关闭计算机
    • -r 重启
    • 立即关机
    • shutdown -h +10 10分钟后关机
    • shutdown -h 23:30 23:30 关机
    • shutdown -r now 立即重启
    • poweroff 立即关闭计算机
    • reboot 立即重启计算机
  • !! 重复上一个输入的命令

  • !l 重复前一条以l开头的命令

  • !n 重复history 中序号为n的命令

  • !?abc 重复命令中包含abc的命令

  • !-n 重复n个命令之前的命令

  • alias -p 查看变量别名
  • alias vim=‘vi‘ 创建别名

  • chmod 修改权限
    • chmod +x file
    • +增加权限
    • -去除权限
    • x执行权限

top 显示的信息

zombie 僵尸进程

%Cpu(s)

us sy ni id
系统用户 内核进程 改过优先级 空闲百分比
  • s 运行状态,有一下这些状态
    • D 不可中断的睡眠状态
    • R 运行
    • S 睡眠
    • T 跟踪/停止
    • Z 僵尸进程
PID USER NI RES S %CPU %MEN TIME+ COMMAND
进程ID 所有者 优先级 实际使用内存大小 状态 上次更新到现在cpu时间占用百分比 使用物理内存百分比 使用CPU事件,单位1/100秒 命令名/命令行
  • echo $? 查看退出状态码

  • exit 10 手动修改状态码

  • pstree 进程树型结构

  • jobs 查看当前后台运行的命令

  • kill 杀进程 后可跟PID 或 进程名

  • nice 改变进程优先级
    • 进程优先级越高,数字越小
    • nice -5 vi file 以优先级5运行vi
    • nice -n -5 vi file 以优先级-5运行vi
    • renice -n -20 PID 更改进程优先级
  • ps 显示进程
  • top 实时显示信息,类似任务管理器

所爱隔山海,山海不可平
海有舟可渡,山有路可行
山海皆可平,难平是人心

以上是关于shell的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 片段

vue2.0 代码功能片段

nodejs常用代码片段

sh shell片段

常用python日期日志获取内容循环的代码片段

Eclipse 中的通用代码片段或模板