![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# 当前目录所有目录中的文件 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运行该脚本 # -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 "\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 磁盘空间