shell知识一

1.输出变量的值: echo $变量名 或 echo ${变量名}

2.删除变量:unset 变量名

3.变量赋值:变量名=值

  3.1 如果值中存在空格需要使用双引号或单引号括起来

  3.2 $lang="the lan is $Lang", 双引号中的$保留原有的作用

  3.3 变量值中如果存在需要执行的命令,使用`命令`或者$(命令)的方式,例如:thePwd=`pwd` 或者 thePwd=$(pwd)

  3.4 export 变量名: 该变量成为环境变量,能用于子shell中,但是如果在子shell中unset该变量,它并不会真正unset掉父shell中的该变量值

      例如:name=ajia

            export name

   bash #进入子shell的命令

   echo $name

  3.5 env或export:查看所有的环境变量,set:查看所有的的变量

  3.6 echo $$:查看当前shell的pid

  3.7 echo $?:查看上一个执行命令的结果回传码,0表示上一次执行的命令成功,非零则是错误码

  3.8 read 变量名:以输入值为变量的值,例如 read -p "input your name:" -t 10 name

  3.9 declare -aixr 变量名 声明变量

              -a 表示声明为array类型

     -i 表示声明为int类型

     -x 表示声明为环境变量

     -r 表示声明为只读类型 (尽量少用,一旦定义除非重新启动系统,否则既不能unset,又不能declare)

     -p 查看变量的声明情况

  

  3.10 arr[0]="hello" arr[1]="world" 数组变量的赋值, echo ${arr[0]}:数组的key为0的元素输出,${arr[*]} 或 ${arr[*]}表示输出该数组所有元素,${arr}表示输出数组第一个元素, 

       ${#arr[@]}或者${#arr[*]}数组的总数, ${#arr[下标]}:某个元素的长度

  3.11 字符串长度:${#变量名}

4.ulimit 设置文件系统和程序的限制

  ulimit -a 查看当前系统所有的限制额度,其中“file size”表示可创建的单一文件的大小,“open files”表示可同时打开的文件数量

5.type -a 命令名称  :查看该命令被定义的情况

6.shell中命令的执行顺序:

  1.首先会根据相对或绝对路径来执行命令,例如 /data/test.sh 或 ./test.sh

  2.由alias找到该命令来执行

  3.由bash内置的命令来执行

  4.通过$PATH环境变量的顺序找到第一个命令来执行

7.[^abc]表示不以a或b或c开头的一个字母

8.数据流重定向:

  1. 输出重定向:>:以覆盖的方式将输出重定向到文件或设备, >>:以追加的方式重定向, 这是针对命令执行正确的情况,如果是错误命令产生的输出,需要使用下面的命令来重定向

  2. 错误输出重定向: 2>或2>>

  3. 需要同时进行正确和错误重定向,使用2>&1,例如 ls -al me >demo.txt 2>&1,  不必用2>>&1的方式,错误信息是会追加到&1的文件末尾

  3. 如果是重定向到文件,会判断该文件是否已经存在,如果不存在则创建,>的方式会先将文件内容清空后写入,而>>则追加到文件内容尾巴

Command > filename把标准输出重定向到一个新文件中

Command >> filename把标准输出重定向到一个文件中(追加)

Command > filename 2>&1把标准输出和错误一起重定向到一个文件中

Command 2 > filename把标准错误重定向到一个文件中

Command 2 >> filename把标准输出重定向到一个文件中(追加)

Command >> filename2>&1把标准输出和错误一起重定向到一个文件(追加)

  4. /dev/null:垃圾箱,可以将不显示的内容重定向到该路径下

  5. 多行命令同时顺序执行,使用分号隔开, 例如:mkdir demo; flag=$?; echo ${flag} 

  6. cmd1 && cmd2 如果cmd1成功执行,cmd2才会被执行,与的关系

  7. cnd1 || cnd2 如果cmd1成功执行,cmd2则不会被执行了

   

9.选取命令

  cut -d "分隔的字符" -f 需要获取的第个数据,

  例如:echo $PATH -d ':' -f 3,5 输出$PAHT按:分隔后的第3和第5个数据

        echo $PATH -d ':' -f 2-4 输出第2到第4的数据

   

  grep -v '过滤的条件':反向选择出那些除了过滤条件的内容

10. 检查变量是否存在被赋值了,没有则给予默认值,例如检查变量filename是否赋值,没有则值为defaultName

    filename=${filename:-"defaultName"}

11. date时间命令

    date +%Y%m%d 显示当前日期

    date +%Y%m%d -d "-1 day" 或者 date +%Y%m%d --date="-1 day"  显示昨天的日期

12. test命令

    检查文件名是否存在:test -e 文件名

    检查文件名是否存在且为文件: test -f 文件名

    检查文件名是否存在且为目录: test -d 文件名

    检查文件存在且具有读的权限: test -r 文件名

    文件1的修改时间是否早于文件2,也就是文件1是否比文件2旧: test 文件1 -ot 文件2

                                                        新: test 文件1 -nt 文件2

    检查文件是否为空 test -z 文件名

    多个条件的与:-a

    test -e 文件名 -a -x 文件名:  文件是否存在 且 是否具有x的权限

    多个条件的或:-o 

    test -e 文件名 -o -x 文件名:  文件是否存在 或 者是否具有x的权限

    反向状态

    test ! -w 文件名:如果文件不具有w的权限则为真

13. 判断符号[],其他用法与test类似

    []的开头和结尾需要有空格

    []的元素都应该以“空格键”来隔开

    []的变量和常量都应该用双引号括起来

    

14. sh或bash 脚本 的方式:其实在子shell中执行

    source 脚本 或 ./脚本: 其在父shell

15. 脚本中默认的参数变量:

    $0:表示脚本本身

    $1-$n:表示第1个到第n个传递给脚本的参数

    $#:表示参数的总个数

    $@:表示所有的参数,但是这些参数是独立的,使用循环语句可以依次输出

    $*:表示所有的参数,但是这些参数是一体的

16. if语句

    1.条件与或的多种写法:单个[]和多个[]

    if [ $cho == 'Y' -o $cho == "y" ]   等于 if [ $cho == 'Y' ] || [ $cho == 'y' ]

    2.多条件的写法:

    if [ 条件1 ]; then

执行1

    elif [ 条件2 ]; then

执行2

    else

        执行3

    fi

    3.另一种条件语句

    case $变量名 in

    "值1")

执行1

;;

    

    "值2")

        执行2

;;

   

    *)

        默认执行

;;

    esac

17. function功能

    1. 在脚本的最前定义function的内容:

       function 函数名(){

//函数具体作用,其中$0表示函数本身,$1-$n表示传递给函数的变量,与传递给脚本的参数没有任何关系

//例如:echo $(($1+$2));

       }

    2. 在脚本中调用函数: 函数名 参数  

18. 循环语句

    1. while语句表示当条件成立时"开始执行"

    while [ 条件 ]

    do

执行

    done

    2.until语句表示当条件成立时候"终止执行"

    until [ 条件 ]

    do

执行

    done

    3. for语句

    for i in 值1 值2 值3

    do

每次执行变量i的值都依次等于值1、值2···

    done

    举例:可用于循环数组

    arr[0]=1

    arr[1]=2

    arr[2]=3

    

    #${arr[*]}表示数组的所有元素

    for i in ${arr[*]}

    do 

echo $i

    done

    或者

    #${#arr[*]}表示数组的长度

    for (( i=0; i<${#arr[*]}; i=i+1 ))

    do

echo ${arr[$i]}

    done

19. lx=$(seq 1 10)   获取1到10的连续数值

20. sed工具

    sed -模式 'n1,n2function'  #必须要有单引号

    举例:

    以行为单位的新增或删除

    cat -n /etc/passwd | sed '2,4d'   #删除etc/passwd中的第2到第4行后显示出来

    cat -n /etc/passwd | sed '3,$d'   #删除第三行开始到最后一行的数据后显示

    cat -n /etc/passwd | sed '2a add new con'    #在第2行新增一行新内容

    cat -n /etc/passwd | sed '2,4a add new con'  #在第2行到第4行都新增一行新内容

    cat -n /etc/passwd | sed '2,3c cancel that line' #将第2到第3行的内容替换成cancel that line

21. 正则

$:匹配行尾:以$之前的字符为结尾

^:匹配行首,以^之后的字符为开头,例如:^bi:表示以bi开头的

*:匹配*前一个字符的0-n次的字符,例如:b*i:可以匹配bi、bbi、bbbbbi等

.:匹配任意一个字符,例如:b.i:可以匹配bai、b i(空格也可以被.匹配)

        表示空行的正则:^$   表示非空行:^[^$]

+:匹配+前一个字符的1-n次的字符

?:匹配?前一个字符的0到1次字符

[]:匹配字符的集合,例如[0-9]、[a-c]等

   ^如果放在[]中则表示取反,[^a-c]:匹配非abc的字符

22. grep 过滤

    1. 形式 grep -选项 过滤条件(可以是字符串或者正则)例如:grep -i todo test.sh   #将test.sh文件中含有todo不分大小写的“行”内容提出出来

    2. grep -选项 过滤条件 文件1 文件2  #多个文件中过滤获取内容

    

     
shell知识一