常用 shell 命令

文件操作

  • 新建文件 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 ]

字符串运算符


常用 shell 命令_第1张图片
image.png

文件测试运算符


常用 shell 命令_第2张图片
image.png
  • 流程控制
    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

你可能感兴趣的:(常用 shell 命令)