shell简单了解

Linux相关

  • /proc/$PID:表示进程的文件
  • /dev/null:垃圾箱,黑洞

shell内部构造

  • 变量:变量分为:局部变量环境变量shell变量
    • shell变量:一部分是局部变量,一部分是环境变量,对shell很重要。比如:IFSPS1是局部shell变量
    • 环境变量使用export进行导出,环境变量可以让子进程继承
  • .bashrc:在每次创建bash进程时会执行一次
  • 标准输入输出以及对应的文件描述符:stdin-0, stdout-1, stderr-2

bash

特殊符号总结

  • 反引号:子shell,若要获得值,直接var=`command`即可。
  • 单引号:字符串,原样
  • 双引号:字符串,支持转义字符和变量
  • []:算术运算
  • [[]]:是[]在用作条件运算时的扩展
  • {}:将变量和周围的字符串隔离开来,如echo "some strange ${Java}Script"
  • ()
    • 子shell:(ls)var=$(ls)
    • 数组:array=(1 2 3)
  • (()):算术运算
  • $:表示取出变量的内容,直接取出变量的值相当于执行命令
    var=(expr 3 + 4);
    $var;
    

语句格式

  • #:注释
  • ::空语句
  • 一般语句没有分号要求

变量

  • 声明:等号前后不能有空格:var="acc"
  • 读取:echo ${var}
  • 删除变量:unset var
  • 只读变量

字符串

  • 单引号:原样打印:var='test_acc'
  • 双引号:计算变量:acc="aod ${var}"
  • 获得字符串长度:echo ${#var}
  • 单个字符查找:需要借助exprecho `expr index ${var} char`
  • 子串:echo ${str:start:length}
  • 还有很多字符串操作,截取等# ## % %%

数组

  • 数组元素可以为,元素类型可以不同
  • 定义数组
    array_1=(1 2 3); # 整体
    array_2[1]=23;   # 分开来
    array_3=(        # 支持换行
        1
        2
    )
    
  • 数组操作
    • 获得某个元素:echo ${array[index]}
    • 获得所有元素:echo ${array[*/@]}
    • 获得元素数量:echo ${#array[*/@]}
    • 获取所有索引:echo ${!array[*/@]}。(对于散列数组很有用)
  • 关联(散列)数组:需要先声明
    declare -A array_hash
    array_hash=([a]=aa [b]=bb);
    array_hash[c]=cc;
    

运算

  • 算术运算:不推荐使用原生算术运算
  • 算术运算:子shell + 命令的方法。(expr必须有严格的空格,因为空格区分参数)
    var=$(expr 5 + 4);
    var=`expr 5 + 4`
    
  • 整数关系运算:只能用于判断语句中空格要求
    • -eq,-ne,gt,lt,ge,le,-a,-o
    if [[ 23 -eq 24 -o 24 -eq 34 ]]; ...
    
  • 字符关系运算
    • =,!=,-z,-n
    if [[ "acc" = "bibi" ]]; ...
    
  • 文件关系运算符
    • 是否存在,是否是符号连接,是否是目录,是否是块设备,等等等
  • 可以使用test指令进行判断,可用于if

命令参数

  • $x特殊变量。可用于终端,脚本,函数
    - - - - - -
    $0 名称 $n 参数 $$ PID
    $# 参数数量 $* 所有参数 $@ 所有参数
    $? 退出状态

函数

  • 一般格式,可以不用换行
    [function] func_name[()]
    {
        action;
        [return int;]
    }
    

条件控制

  • if
    if [[ $(ps -ef | grep -c "sh") -gt 1 ]];
    then
        echo "sh than 1";
    elif [[ $(ps -ef | grep -c "sh") -lt 1 ]];
    then
        echo "sh not than 1";
    fi
    
  • case:采用模式进行匹配,使用;;作为终止,使用*作为默认。用于字符串模式匹配时,不要引号
    case $name in
        *saku*) echo "1";
        ;;
        *) echo "2";
        ;;
    esac
    

循环控制

  • for
    for var in item1 ... itemN;
    do
        action;
    done
    
  • while,支持breakcontinue
    while condition;
    do
        action;
    done
    
  • until
    until condition;
    do
        action;
    done
    

输入输出重定向

  • n>,n<:将一个文件重定向到另一个文件。
    • n表示文件描述符0是stdin,1是stdout,2是stderr
    • >>表示将输出追加到文件末尾
    • n>& m表示将输出文件n合并到输出文件m。两者都是文件描述符
  • 当使用command > file时实际发生了:command输出到stdoutstdout重定向到file
  • |:管道运算符:将标准输出重新作为标准输入
  • <<tag:表示将标记之间的内容作为输入
# 将stderr合并到stdout,将stdout输出到文件中。顺序不能改变
ls + . > file 2>&1;

# 将stdout输出到file1,将stderr输出到file2
ls + . >file1 2>file2;

# 将整个作为grep命令的输入,可以理解为替代管道符号 |
grep s <<!
not s
yes
is s
!

文件包含

  • . filesource file:将文件包含到当前文件中。

#命令

*/bin命令

  • tr:替换字符串:cat /proc/$PID/environ | tr "\0" "\n"
  • tee:将标准输入一方面输入到文件,另一方面到标准输出
    echo "string" | tee file1.txt file2.txt | cat
    
  • sort:对行进行排序
    sort file.txt;
    cat file.txt | sort;
    
  • cat:读取显示文件。
    # 拼接标准输入
    echo "some text" | cat - file;
    echo "some text" | cat /dev/stdin file;
    
  • echo
  • printf:用法同C语言
  • pgrep:得到符合模式字符串的PID
  • expr
    • 四则运算(+,-,\*,/,%,=)只支持整数。注:乘号需要转义
    • 比较运算(==,!=)还支持字符串
  • read:获取键盘输入,可以直接将结果存在变量中:read result
  • find:会递归寻找给定目录下的所有文件
    find . \( -name "*.sh" -o -name "*.py" \) -print
    
  • xargs:可用于将标准输入的内容格式化;也可用于将标准输入作为命令的参数
    echo "/dev" | xargs ls;     # v
    echo "/dev" | ls;           # x
    
  • md5sum:文件校验和
  • split:文件分割

bash内命令

  • alias unalias:别名。别名是暂时的,可以将操作追加到.bashrc使别名在每个终端生效。
    echo 'alias install="sudo apt install"' >> ~.bashrc
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章