• Shell-学习笔记


    -------------------------记录了我的Shell学习笔记----------------------------

    TIPS:

      1.shell文件第一行使用"#!"来表示使用什么程序来执行该脚本程序, 最好使用#!/bin/bash而不是#!/bin/sh, 当然也可以使用其他解释器

      2.亦可以不用"#!"头, 而使用sh等命令来执行, 比如sh a.sh

      3.若想使用./a.sh等形式直接执行, 1)头部需要加上用来解释本脚本的解释器 2)chmod [a|u|g|o]+x file #中括号内选一个

      4.在shell中开启一个线程执行其他语句可以使用`...`、$(...)等形式

    变量:

      在Shell里, 每一个变量的值都是字符串, 无论给变量赋值的时候有没有使用引号, 值都会以字符串的形式存储.

      1.变量赋值时"="左右不许有空格

    name=John

      2.需要注意shell的默认赋值是字符串赋值,

    sum=1+1; 
    echo $sum; 
    #结果输出"1+1"

      3.算术运算, 为了达到上步想要的效果有以下几种表达方式

    let "var+=1" 或者 let a++ 或者 let "var=1+1" 或者 let "var=var1+var2"
    var="$[var+1]" #执行算术运算 赋值给别的变量用的 $[]将中括号内的表达式作为数学运算先计算结果再输出
    ((var++)) #本身赋值用的
    var=$((var+1)) #执行算术运算 赋值给别的变量用的
    r=`expr var1 + var2` #注意空白

    字符串:

      可以用单引号、双引号、不用单双引号直接字符串(但有空格、分号什么的就得用引号了, 所以表示字符串最好最外加上引号), 单引号、双引号间区别为解释和不解释里面的特殊符号及变量, 比如 "!", $name等, 当双引号的时候使用echo "a{$name}"; 其中name为"John", 则输出"a{John}", 需要使用${var}形式, 在Shell里空格什么的可不能跟PHP样随意做分隔符用, 如果想输出大段字符串可以使用类似PHP中定界符形式来代替多次echo

    cat <<TEXT
    AAA
    BBB
    CCC
    TEXT

      顺带打印字符串函数:

        echo 打印后自动换行 #echo 'abcd ${name}'

          -n: 输出时不输出结尾换行符

          -e: 使用转义序列 #echo "1 2 3" 会输出1制表符2制表符3

        printf 打印后不会自动换行, 与C和PHP不同的是参数间以空格隔开 #printf "My name is %10s " "John_ABC"

     if语句

    if ....; then
      ....
    elif ....; then
      ....
    else
      ....
    fi

    大多数情况下, 可以使用测试命令来对条件进行测试, 比如可以比较字符串、判断文件是否存在及是否可读等等……通常用"[]"来表示条件测试, 注意这里的空格很重要, 要确保方括号前后的空格

    变量判断
    [ -n "$var" ] #判断$var变量是否有值
    文件判断
    [ -r file "somefile"] #用户可读为真
    [ -w file "somefile"] #用户可写为真
    [ -x file "somefile"] #用户可执行为真
    [ -f file "somefile"] #文件为正规文件为真
    [ -d file "somefile"] #文件为目录为真
    [ -c file "somefile"] #文件为字符特殊文件为真
    [ -b file "somefile"] #文件为块特殊文件为真
    [ -s file "somefile"] #文件大小非0时为真
    [ -t file "somefile"] #当文件描述符(默认为1)指定的设备为终端时为真


    数值比较
    [ $a -eq $b] #两个数值是否相等 还有ne, le, lt, ge, gt #使用此种方式足够
    (( $a < $b )) #注意使用(())


    字符串比较(比较字符串使用""包含字符串变量是个好习惯)
    [[ -n $str ]] #判断字符串不为null
    [[ -z $str ]] #判断字符串为null, 长度为0
    [[ "$test"x = "test"x ]] #可以使用=, <, <=, >, >=, !=, 字符串比较可以使用"["或者"[[", 但是在"["结构中"<"等字符都需要转义, 所以推荐只使用"[["形式, 都加个x字符避免变量为空


    也可以使用 test [...]等来测试

    && 和 || 操作符
    [ -d "somefile" ] || { echo "Can not read $mailfolder" ; exit 1; } #类似PHP和C的短路形式 后面使用{}保持一体容易阅读


    case语句
    case表达式可以用来匹配一个给定的字符串, 而不是数字(可别和C语言里的switch...case混淆), 匹配可以使用通配符

    case ... in
       ...) do something here
       ;; #双分号结束
       ...) do something here
       ;; #双分号结束
    *) do something here #此处*匹配所有情况字符串, 即可代替C中的default
    ;;
    esac

    select语句

    select表达式是bash的一种扩展应用, 擅长于交互式场合, 与read不同的是用户可以从一组不同的值中进行选择, 而不是让用户输入

    select var in ... ; do #注意此分号
     break; #注意此break, 如果没有break将会一直循环下去
    done
    .... now $var can be used ....

    下面是一个简单的示例

    #!/bin/bash
    
    echo "What is your favourite OS?"
    select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
         break;
    done
    echo "You have selected $var"

    可以配合select与case使用

    #!/bin/bash
    echo 'What is your name?'
    select var in 'John' 'Nali'; do
        case $var in
            'John') echo 'His name is John';;
            'Nali') echo 'Her name is Nali';;
            *) echo 'No ever';;
        esac
        break; #注意此break, 如果没有break将会一直循环下去 
    done

    while语句

    while ...; do
       ....(break|continue)
    done

    for语句

    for var in ....; do #可以使用{1..10}, {a..z}, '1' '2', `seq 1 100`等形式做为数组
       ....
    done

    引号

    引号可以忽略通配符的扩展, 比如现目录下有abc.jpg, bcd.jpg 执行以下命令会列出此两个文件abc.jpb bcd.jpg

    ls *.jpg

    如果使用以下命令则只会列出'*.jpg'(如果有的话)

    ls '*.jpg' #或者 "*.jpg"

    也可以使用转义符来忽略

    ls *.jpg

    here

  • 相关阅读:
    整数反转
    两数之和
    设计模式-备忘录模式
    设计模式-迭代器模式
    设计模式-中介者模式
    设计模式-观察者模式
    C# OpenFileDialog和SaveFileDialog的常见用法
    SQL数据库表结构的修改(sql2005)
    C# 时间格式处理
    C# 集合类(四)
  • 原文地址:https://www.cnblogs.com/JohnABC/p/3248498.html
Copyright © 2020-2023  润新知