文件操作
- 新建文件 touch 1.txt
- 新建文件夹 mkdir test
- vim编辑文件 vim 1.txt (按i进入编辑模式,:wq保持退出,:qa!强制退出)
- 查看文件 cat 1.txt
- 删除空目录 rmdir -r test
- 删除非空目录 rm -rf test
- 删除文件 rm 1.txt
- 复制文件 cp 源文件 目的地
- 移动文件 mv 源文件 目的地
- 列出文件 ls , ls -l
- 输出重定向命令:> ,如:ls > test.txt 覆盖 >> 追加
- 分屏显示:more index.html . 当index.html内容超过一屏,则只显示一屏,按空格显示剩余内容
- 管道:| ,ls | more, 一个命令的输出可以通过管道做为另一个命令的输入
- 清屏:clear
- 文本搜索: grep , grep [-选项] ‘搜索内容串’文件名
grep -E '\.jsx?$' // 使用正则匹配
grep -v '__story__' // 使用反转匹配,即匹配不是__story__ 的文件
grep -n "abc" // 显示行号
- 文件查找:find 查找路径 查找的标准 查找到之后的动作,
find . -name '*.txt' // 当前目录按文件名查找
find . -type f // 当前目录按文件类型查找
- 文本处理: sed
sed -n filename // sed 默认会打印文件内容,故常用 -n 禁止该行为,使其只打印匹配到的内容
sed -n '2p' data // 打印第二行 ,p 表示打印,前面跟数字表示打印第几行 ‘1,4p’打印1-4行
sed -n '/last/,4p' // 打印从/last/到第四行的内容,p前面也可跟正则表达式,常用模式是 sed -n '开始,结束p',开始和结束都可用正则
sed -n '/last/,4!p' // 用!表示对前面模式取反,即打印除了从/last/到第四行的内容
sed -n '1,4{=;p}' data // p只是一个命令,若想用其他命令,如=表示显示行号,需用{}包裹,不同命令用;分隔
sed -e '/^#/d' -e '/^$/d' /etc/vsftpd.conf // sed支持对单个文件同时做不同操作,每个操作用 -e 参数
sed -i // 直接修改读取的文件内容,而不是输出到终端
// sed 常用命令有:
p 打印
= 显示行号
d 删除行
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
s 使用替换模式替换相应模式 sed 's/要被取代的字串/新的字串/g'
c\ 用新文本替换定位文本
- 文件统计:wc
wc -l // 统计行数
wc -w // 统计字数
- 文件打包: tar -cvf ***.tar 1.py 2.py 3.txt *.c
- 文件解包:tar -xvf ***.tar -C ~/Desktop
- 文件上传:scp /home/open/tools.tar.gz [email protected]:/home/root
- hash命令:hash nrm 第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找
- 一些全局变量:HOME,PATH,PWD
- 网络操作: curl
- 磁盘使用情况 du -hs *
权限操作
https://www.jianshu.com/p/b2c35263eccd
Shell 脚本
基本语法
- 变量
1、定义:申明时不用关键字,直接写变量名称,如 DIR = "",变量名前加 readonly DIR 表示只读
2、取值:跟ES6有点像,${DIR} ,不加花括号也可以,但不推荐
3、删除: unset DIR , 不能删只读变量
5、字符串:单双引号包裹,单引号内不能使用取值操作
6、字符串操作:
str = "hello world"
// 获取长度
echo ${#str} 11
// 提取字串
echo ${string:1:4} ello
// 查找字串(查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):)
echo `expr index "$str" io` 4
7、数组操作
// 申明,空格区分元素
arr = (1 2 3 4)
// 取值,要用 ${}包裹
${arr[index]}
// 获取数组长度
${#arr[@]}
- 表达式语法
test = `expr 1+2`
test = $(1+2)
- 运算符
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
// 算数运算符,数字与操作符之间要有空格,
`expr $a + $b`
// 关系运算符,只支持数字,不支持字符串,除非字符串的值是数字
if [ $a -eq $b ]
// 布尔、逻辑运算符 and or ! -a -r ! && ||
if [ $a -lt 100 -a $b -gt 15 ]
字符串运算符
文件测试运算符
- 流程控制
if 操作
// if
if condition
then
command1
command2
fi
// if...else..
if condition
then
command1
command2
else
command
fi
// if...elseif...else
if condition
then
command1
command2
elif
command
else
command
fi
for 循环
// 多行
for var in item1 item2
do
command1
command2
...
commandN
done
// 单行
for var in item1 item2; do command1; command2 done;
// 例子
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
- 一些特殊用法
[ ] 与 [[ ]] ,前者里的内容是表达式,遇到<>这种在shell里有特殊含义的字符时需要转义,后者不需要,所以在写 if 判断时,最好用后者
if [ $# \< 1 ]; then 等价于
if [[ $# < 1 ]]; then // 注意空格:开始、结尾、运算符
let a=1+2 与 a = expr 1+2
与 let a=$((1+2)) 与 let a=$[1+2] 等价
命令替换
DIR1=$(cd "$(dirname "$0")"; pwd)
最佳实践
- 常用变量类型三种
// 数字
SIZE = 1024
// 字符串
DIR = '../dir'
// 数组
arr = (1 2 3 4)
- 字符串运算符
if [[ a=b ]]
if [[ a!=b ]]
if [[ -z a ]] // 长度为0
if [[ -n "a" ]] // 长度不为0
- 文件运算符 file 就是表示文件路径的字符串
if [[ -e file ]] // 文件是否存在(目录或文件)
if [[ -d file ]] // 目录
if [[ -f file ]] // 文件
if [[ -x file ]] // 可执行权限
- 逻辑运算符
使用单中括号做复杂判断
a=5
b=10
# 非运算
if !(( a == b ))
then
echo "a!=b"
fi
# 或运算
if [ $a -gt 8 -o $b -gt 8 ]
then
echo "a > 8 || b > 8"
fi
# 与运算
if [ $a -lt 10 -a $a -gt 0 ]
then
echo "0
- 流程控制
if conditon
then
command
fi
if conditon
then
command
else
command
fi
- 遍历数组操作
for i in ${array[@]}
do
echo $i
done
- 函数
// 声明
function funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
command
}
// 调用传参
funWithParam 1 2 3 4 5 6 7 8 9 34 73
- 错误处理
$?这个常量代表的就是上一段shell的返回值,0 表示正常,非0 表示异常;
当有连续的 shell 命令执行时,可在每条命令之间加个 $? 的判断;不过这样写比较麻烦,可以在多条命令之间用 && 连接,这样前面的命令失败的话,后面的命令是不会执行的
// 该命令会输出 当前执行的命令并在命令失败时自动退出,不继续执行
set -euxo pipefail
- $ 的多种用法
// ${a} 表取值 和 $a 差不多
// $[] 和 $(()) 支持数字运算
a=1
b=2
echo $[$a+$b]
echo $(($a+$b))
// $() 表命令替换,就是在shell 中fork 一个子进程去做 他们 括起来的命令 然后将结果再返回父进程
version=$(command -v npx)
echo $version
- 交互输入
#!/bin/bash
read -p "May I ask your name: " name
echo "Hello $name"
exit 0
Mac设置环境变量
// 1、打开bash_profile
vim ~/.bash_profile
// 2、粘贴路径
export PATH="$PATH:/Users/FYC/arcFolder/arcanist/bin/"
// jdk
使用命令打开./bash_profile文件
vim ~/.bash_profile
配置环境
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
// 3、链接一下
source ~/.bash_profle
参考
- https://github.com/greedbell/blog/blob/master/shell/string.md