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=$'\n '

# 如果只有单个 可以
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
# 这种方法会将双引号中带空格的一个命令拆分为多个

# 处理参数
# :ab:c 第一个:表示禁止警告信息
# 当没有在:ab:c中出现时,会将选项变成?
# 如果不是以-开头会停止解析
while getopts :ab: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 

1   SIGHUP  刮起进程
2   SIGINT  中断进程
3   SIGQUIT 停止进程
9   SIGKILL 无条件终止进程
15  SIGTERM 如果可能的话终止进程
17  SIGSTOP 无条件停止
18  SIGTSTP  停止或暂停
19  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运行该脚本
# -2020 其中-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 0255

# 在函数内部使用echo 返回给result
result = `funcname`
可以返回浮点数 和 字符串

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

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

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

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

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

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

选项菜单 其中 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

0 普通
1 强亮
2 弱亮
3 斜体
4 下划线
5 慢闪烁
6 快闪烁
7 背景/前景色反转
8 将前景色改为背景色

0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 洋红
6 青色
7 白色

CSI用\033代替
echo -e "\033[30m 黑色字 \033[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 磁盘空间
View Code

 

转载于:https://www.cnblogs.com/tujw/p/10571788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值