Linux命令

权限相关常用

  • chown:修改组
  • chmod:修改权限

    处理目录的常用命令

  • ls(英文全拼:list files): 列出目录及文件名

    • 只列出来文件夹:
      1. ls -F |grep "/$"
  • cd(英文全拼:change directory):切换目录

  • pwd(英文全拼:print work directory):显示目前的目录
  • mkdir(英文全拼:make directory):创建一个新的目录
  • rmdir(英文全拼:remove directory):删除一个空的目录
  • cp(英文全拼:copy file): 复制文件或目录
  • rm(英文全拼:remove): 移除文件或目录
  • mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称

    磁盘相关命令

  • df:列出文件系统的整体磁盘使用量

  • df [-ahikHTm] [目录或文件名]
  • du:检查磁盘空间使用量
  • du [-ahskm] [文件或目录名称]

    1. $ du -h -d1
    2. # 查看当前目录的大小,只看一级,d后面如果是2就看二级,-h 提高可读性(以K/M/G)为单位

    VIM编辑

    最常见的
    i:开始输入字符
    :wq! 强制保存并退出编辑
    :set nu 展示行号
    批量替换:
    :100,200s/vbird/VBIRD/g :100~200行中间所有的vbird替换为VBIRD
    :1,$s/word1/word2/g: 从第一行到最后所有的vbird替换为VBIRD
    其他命令参考
    https://www.runoob.com/linux/linux-vim.html

    SHELL

    最常见的头: #!/bin/bash

    变量

    定义变量

    1. your_name="dachun.wang"

    注意点:变量名和等号之间不能有空格

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 除了显式地直接赋值,还可以用语句给变量赋值,如:
    1. # 打印etc目录下所有文件的文件名
    2. for file in `ls /etc` then; do echo $file; done
    3. #或
    4. for file in $(ls /etc) then; do echo $file; done
    使用变量
    使用一个定义过的变量,只要在变量名前面加美元符号即可
    1. echo $your_name
    2. #或者
    3. echo ${your_name}
    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
    **
    1. for skill in Ada Coffe Action Java; do
    2. echo "I am good at ${skill}Script"
    3. done
    如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
    删除变量
    1. unset variable_name

    字符串

    字符串可以用单引号,也可以用双引号
    **
    1. str='this is a string'
    2. str="this is a string"
    单引号字符串的限制:
  • 单引号里的任何字符都会原样输出,**单引号字符串中的变量是无效**的;

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
    1. your_name="abc"
    2. # 使用双引号拼接
    3. greeting="hello, "$your_name" !"
    4. greeting_1="hello, ${your_name} !"
    5. echo $greeting $greeting_1
    6. # 使用单引号拼接
    7. greeting_2='hello, '$your_name' !'
    8. greeting_3='hello, ${your_name} !'
    9. echo $greeting_2 $greeting_3
    输出:
    1. hello, runoob ! hello, runoob !
    2. hello, runoob ! hello, ${your_name} !
    获取字符串长度
    1. string="abcd"
    2. echo ${#string} #输出 4
    字符串截取
    1. string="runoob is a great site"
    2. echo ${string:1:4} # 输出 unoo
    注意:index从0开始

字符串查找
查找字符 io 的位置(哪个字母先出现就计算哪个):

  1. string="runoob is a great site"
  2. echo `expr index "$string" io` # 输出 4

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

  1. #方式1
  2. array_name=(value0 value1 value2 value3)
  3. #方式2
  4. array_name[0]=value0
  5. array_name[1]=value1
  6. array_name[n]=valuen

读取数组

  1. # ${数组名[下标]}
  2. echo ${array_name[0]} #输出value0
  3. # 不带坐标,返回第0个
  4. echo ${array_name} #输出value0
  5. # 输出所有元素
  6. echo ${array_name[@]} #输出value0 value1 value2 value3
  7. # 查询数组长度
  8. echo ${#array_name[@]} 输出4

注意:数组必须带{},否则识别不了

  1. echo $array_name[0] #输出 value0[0]

传参

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4. echo "Shell 传递参数实例!"
  5. echo "执行的文件名:$0"
  6. echo "第一个参数为:$1"
  7. echo "第二个参数为:$2"
  8. echo "第三个参数为:$3"
  9. echo "参数个数为:$#"

输出

  1. $ chmod +x test.sh
  2. $ ./test.sh 1 2 3
  3. Shell 传递参数实例!
  4. 执行的文件名:./test.sh
  5. 第一个参数为:1
  6. 第二个参数为:2
  7. 第三个参数为:3
  8. 参数个数为:3

$? 代表脚本是否正确执行,可用于做逻辑判断
$ 和 $@的区别:$是一个参数。¥@是每个参数

  1. echo "-- \$* 演示 ---"
  2. for i in "$*"; do
  3. echo $i
  4. done
  5. # 返回 1 2 3
  6. echo "-- \$@ 演示 ---"
  7. for i in "$@"; do
  8. echo $i
  9. done
  10. # 返回
  11. # 1
  12. # 2
  13. # 3

算数运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

  1. $ echo 2+2
  2. #输出:2+2
  3. $ echo `expr 2+2`
  4. #输出:2+2
  5. $ echo `expr 2 + 2`
  6. #输出:4
  7. $ expr 2 + 2
  8. #输出:4

expr

  • 仅对整数有效
  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样

算数运算符
image.png

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
image.png

布尔运算符

image.png
image.png
返回
image.png

逻辑运算符

image.png

字符串运算符

image.png

文件测试运算符

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

echo:支持变量、转义字符、支持输出字符到其他文件

  1. #!/bin/sh
  2. # -e 开启转义
  3. echo -e "OK! \n"
  4. echo "It is a test"
  5. # -e 开启转义 \c 不换行
  6. echo -e "OK! \c" #
  7. echo "It is a test"
  8. #字符输出到myfile中
  9. echo "It is a test" > myfile
  10. #显示命令执行结果
  11. echo `date`

printf: printf format-string [arguments…]

  1. #!/bin/bash
  2. # author:菜鸟教程
  3. # url:www.runoob.com
  4. printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
  5. printf "%-10s %-8s %-4.2f\n" 郭靖 66.1234
  6. printf "%-10s %-8s %-4.2f\n" 杨过 48.6543
  7. printf "%-10s %-8s %-4.2f\n" 郭芙 47.9876

结果
image.png
说明:

  1. %s %c %d %f都是格式替代符
  2. %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
  3. %-4.2f 指格式化为小数,其中.2指保留2位小数。

注意:
printf 不会自带换行
printf 单引号也会被替换
printf 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用

  1. printf "%s and %d \n"
  2. # 返回
  3. and 0
  4. printf %s abc def
  5. # 返回
  6. abcdef

test:Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

  1. num1=100
  2. num2=100
  3. if test $[num1] -eq $[num2]
  4. then
  5. echo '两个数相等!'
  6. else
  7. echo '两个数不相等!'
  8. fi

输出结果

  1. 两个数相等!

流程控制

IF

  1. # 标准形式
  2. if condition
  3. then
  4. command1
  5. ...
  6. commandN
  7. fi
  8. # 单行形式,语句之间要加;
  9. if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
  1. # if else
  2. if condition
  3. then
  4. command1
  5. ...
  6. commandN
  7. else
  8. command
  9. fi
  1. # if else-if else
  2. if condition1
  3. then
  4. command1
  5. elif condition2
  6. then
  7. command2
  8. else
  9. commandN
  10. fi
  1. # demo
  2. a=10
  3. b=20
  4. if [ $a == $b ]
  5. then
  6. echo "a 等于 b"
  7. elif [ $a -gt $b ]
  8. then
  9. echo "a 大于 b"
  10. elif [ $a -lt $b ]
  11. then
  12. echo "a 小于 b"
  13. else
  14. echo "没有符合的条件"
  15. fi
  16. # 输出:a 小于 b
  1. # 结合test
  2. num1=$[2*3]
  3. num2=$[1+5]
  4. if test $[num1] -eq $[num2]
  5. then
  6. echo '两个数字相等!'
  7. else
  8. echo '两个数字不相等!'
  9. fi

FOR

  1. # 多行模式
  2. for var in item1 item2 ... itemN
  3. do
  4. command1
  5. command2
  6. ...
  7. commandN
  8. done
  9. # 单行模式
  10. for var in item1 item2 ... itemN; do command1; command2 done;
  1. # demo
  2. for loop in 1 2 3 4 5
  3. do
  4. echo "The value is: $loop"
  5. done

CASE

取值后面必须为单词in,每一模式必须以**右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;**。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

  1. case in
  2. 模式1)
  3. command1
  4. command2
  5. command3
  6. ;;
  7. 模式2
  8. command1
  9. command2
  10. ;;
  11. *)
  12. command1
  13. command2
  14. ;;
  15. esac
  1. #!/bin/sh
  2. site="runoob"
  3. case "$site" in
  4. "runoob")
  5. echo "菜鸟教程"
  6. ;;
  7. "google")
  8. echo "Google 搜索"
  9. ;;
  10. "taobao")
  11. echo "淘宝网"
  12. ;;
  13. esac

其他流程还有 while | until,一般都可以用for循环替代。
循环停止语句 break | continue ,和其他语言的概念无区别

函数

无参数,无返回值

  1. #!/bin/bash
  2. demoFun(){
  3. echo "这是我的第一个 shell 函数!"
  4. }
  5. echo "-----函数开始执行-----"
  6. demoFun
  7. echo "-----函数执行完毕-----"

带返回值函数

  1. #!/bin/bash
  2. funWithReturn(){
  3. echo "这个函数会对输入的两个数字进行相加运算..."
  4. echo "输入第一个数字: "
  5. read aNum
  6. echo "输入第二个数字: "
  7. read anotherNum
  8. echo "两个数字分别为 $aNum 和 $anotherNum !"
  9. return `expr $aNum + $anotherNum`
  10. }
  11. funWithReturn
  12. echo "输入的两个数字之和为 $? !"

参数传递

  1. #!/bin/bash
  2. funWithParam(){
  3. echo "第一个参数为 $1 !"
  4. echo "第二个参数为 $2 !"
  5. echo "第十个参数为 $10 !"
  6. echo "第十个参数为 ${10} !"
  7. echo "第十一个参数为 ${11} !"
  8. echo "参数总数有 $# 个!"
  9. echo "作为一个字符串输出所有参数 $* !"
  10. }
  11. funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出/输入

  • command > file 将输出重定向到 file。
  • command < file 将输入重定向到 file。
  • command >> file 将输出以追加的方式重定向到 file。

基本功能参考:https://www.runoob.com/linux/linux-tutorial.html
各种括号、引号使用的参考:https://blog.csdn.net/taiyang1987912/article/details/39551385