zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/JohnABC/p/3248498.html
Copyright © 2011-2022 走看看