zoukankan      html  css  js  c++  java
  • shell 学习笔记一

    一.布尔运算符列表

    a=10
    b=20

    !
    非运算,表达式为 true 则返回 false,否则返回 true。
    [ ! false ] 返回 true。

    -o
    或运算,有一个表达式为 true 则返回 true。
    [ $a -lt 20 -o $b -gt 100 ] 返回 true。

    -a
    与运算,两个表达式都为 true 才返回 true。
    [ $a -lt 20 -a $b -gt 100 ] 返回 false

    例:if判断变量非空

    #!/usr/bin/env bash

    a="x"

    if [ ! $a ];then

      echo "ls null"

    else

      echo "not is null"

    fi

    输出 not is null

    二.字符串运算符列表

    a=abc
    b=fds

    =
    检测两个字符串是否相等,相等返回 true。
    [ $a = $b ] 返回 false。

    !=
    检测两个字符串是否相等,不相等返回 true。
    [ $a != $b ] 返回 true。

    -z
    检测字符串长度是否为0,为0返回 true。
    [ -z $a ] 返回 false。//判断:如果字符串a为0。此处不为0,返回false

    -n
    检测字符串长度是否为空,不为空返回 true。
    [ -n $a ] 返回 true。 //判断:如果字符串a为空。此处为非空,返回true

    str
    检测字符串是否为空,不为空返回 true。
    [ $a ] 返回 true。

    三.文件测试运算符列表
    例如,变量 file 表示文件“xxx.sh”,它的大小为100字节,具有 rwx 权限。

    -b file
    检测文件是否是块设备文件,如果是,则返回 true。
    [ -b $file ] 返回 false。

    -c file
    检测文件是否是字符设备文件,如果是,则返回 true。
    [ -b $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。

    四.单双引号的区别

    str='this is a string'

    单引号字符串的限制:
    · 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    · 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

    your_name='qinjx'
    str="Hello, I know your are "$your_name"! "
    双引号的优点:
    · 双引号里可以有变量
    · 双引号里可以出现转义字符


    五.获取字符串长度
    string="abcd"
    echo ${#string} #输出 4


    提取子字符串
    string="alibaba is a great company"
    echo ${string:1:4} #输出liba

    六.数组

    定义数组
    在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
    array_name=(value1 ... valuen)
    例如:
    array_name=(value0 value1 value2 value3)
    或者
    array_name=(
    value0
    value1
    value2
    value3
    )

    还可以单独定义数组的各个分量:
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    可以不使用连续的下标,而且下标的范围没有限制。

    读取数组
    读取数组元素值的一般格式是:
    ${array_name[index]}
    例如:
    valuen=${array_name[2]}
    举个例子:

    #!/bin/sh
    
    NAME[0]="Zara"
    NAME[1]="Qadir"
    NAME[2]="Mahnaz"
    NAME[3]="Ayan"
    NAME[4]="Daisy"
    echo "First Index: ${NAME[0]}"
    echo "Second Index: ${NAME[1]}"

    运行脚本,输出:
    sh test.sh
    First Index: Zara
    Second Index: Qadir

    使用@ 或 * 可以获取数组中的所有元素,例如:
    ${array_name[*]}
    ${array_name[@]}

    举个例子:

    #!/bin/sh
    
    NAME[0]="Zara"
    NAME[1]="Qadir"
    NAME[2]="Mahnaz"
    NAME[3]="Ayan"
    NAME[4]="Daisy"
    echo "First Method: ${NAME[*]}"
    echo "Second Method: ${NAME[@]}"

    运行脚本,输出:
    sh test.sh
    First Method: Zara Qadir Mahnaz Ayan Daisy
    Second Method: Zara Qadir Mahnaz Ayan Daisy


    获取数组的长度

    获取数组长度的方法与获取字符串长度的方法相同
    例如:
    获取字符串长度
    aaa="hjfljfoijf"
    echo "${#aaa}"

    获取数组的长度
    取得数组元素的个数
    length=${#array_name[@]}
    或者
    length=${#array_name[*]}
    取得数组单个元素的长度
    length=${#array_name[n]}
    echo "${#length}"

    七.显示转义字符

    echo ""It is a test""
    结果将是:
    "It is a test"

    双引号也可以省略。

    八.echo和read

    输出:echo
    -e 解释转义字符
    回车
    制表符
     回退 baskspace 删除键

    -n 回车不换行


    自定义格式输入:read
    -p 打印输出
    -n 接受多少个用户输入的字符
    -s 关闭回显 需要放在前面,不然会报错
    -t 等待超时

    九.循环语句if...else
    if ... else 语句也经常与 test 命令结合使用,如下所示:(test了解就行,个人感觉太鸡肋,基本没用过)

    num1=$[2*3]
    num2=$[1+5]
    if test $[num1] -eq $[num2];then
    echo 'The two numbers are equal!'
    else
    echo 'The two numbers are not equal!'
    fi

    输出:
    The two numbers are equal!

    等同于

    num1=$[2*3]
    num2=$[1+5]
    if [ $num1 -eq $num2 ];then
    echo 'The two numbers are equal!'
    else
    echo 'The two numbers are not equal!'
    fi

    test 命令用于检查某个条件是否成立,与方括号([ ])类似。

    十.case ... esac
    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

    case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
    case 值 in
    模式1)
    command1
    command2
    command3 ;;
    模式2)
    command1
    command2
    command3 ;;
    *)
    command1
    command2
    command3 ;;
    esac

    例1:创建一个脚本,脚本名为/opt/script.sh让其提供一下特性:
    a) 当运行/opt/script.sh all时,输出none
    b) 当运行/opt/script.sh none时,输出all
    c) 当没有任何参数或者参数不是all、none时,其错误输出产生一下的信息:Usage:/opt/script.sh none|all

    #!/usr/bin/env bash
    case $1 in
    all)
    echo "none";;
    none)
    echo "all";;
    *)
    echo "Usage:/opt/script.sh none|all";;
    esac

    例2:提示输入1到4,与每一种模式进行匹配

    #!/usr/bin/env bash
    echo "Input a number between 1 to 4"
    echo "Your number is:"
    read var
    case $var in
    1) echo "You select 1";;
    
    2) echo "You select 2";;
    
    3) echo "You select 3";;
    
    4) echo "You select 4";;
    
    *) echo "You do not select a number between 1 to 4";;
    
    esac

    case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
    ;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
    取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

    十一.循环语句for
    与其他编程语言类似,Shell支持for循环。

    for循环一般格式为:
    for 变量 in 列表
    do
    command1
    command2
    ...
    commandN
    done

    列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

    in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

    例如,顺序输出当前列表中的数字:

    for loop in 1 2 3 4 5
    do
    echo "The value is: $loop"
    done

    运行结果:
    The value is: 1The value is: 2The value is: 3The value is: 4The value is: 5

    顺序输出字符串中的字符:

    for str in 'This is a string'
    do
    echo $str
    done

    运行结果:
    This is a string

    显示主目录下以 .bash 开头的文件:

    #!/bin/bash
    
    for FILE in $HOME/.bash*
    do
    echo $FILE
    done

    运行结果:
    /root/.bash_history/root/.bash_logout/root/.bash_profile/root/.bashrc

    还可以这样用
    for i in {1..5}
    for i in `seq 1 5`

    还支持类C用法如:
    for ((i=1;i<10;i++))
    do
    代码块
    done


    十二.循环语句while
    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

    while command
    do 
    Statement to be executed 
    if command is true
    done

    例:
    while [ $i -lt 10 ]
    do
    代码块
    i=$((i+1))
    done

    例:
    循环输出hello

    while :    # :该条件恒为真,
    do
    echo "Hello"
    sleep 3
    done

    命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。


    while循环可用于读取键盘信息。
    例:输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

    echo "type <CTRL-D> to terminate"
    echo -n "enter your most liked film: "
    while read FILM
    do
    echo "Yeah! great film the $FILM"
    done    

    十三.循环语句until
    until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。
    until条件循环
    until 直到...时候
    语法:
    until [ 条件 ]
    do
    代码块
    done
    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

  • 相关阅读:
    c# web开发
    向wp8开发进军
    练毛笔字的心得
    刚开通博客园
    DevExpress Asp.net(3) ASPxCallback组件
    DevExpress Asp.net(2) ASPxObjectContainer说明
    DevExpress Asp.net(1) ASPxButton的基本使用
    JavaMail学习笔记(四)、使用POP3协议接收并解析电子邮件(全)
    Java正则表达式(一)、抓取网页email地址实例
    JavaMail学习笔记(五)、使用IMAP协议接收并解析电子邮件
  • 原文地址:https://www.cnblogs.com/dannylinux/p/8144519.html
Copyright © 2011-2022 走看看