美文网首页
Shell 学习

Shell 学习

作者: 如逆水行舟不进则退 | 来源:发表于2020-09-18 16:56 被阅读0次
    • shell 变量
    #!/bin/bash
    # 1.shell 变量
    your_name="yangchuankun"
    echo $your_name
    readonly your_name
    your_name="ckyang"
    #unset your_name
    echo ${your_name}
    echo "hello world!"
    
    # 2.shell 字符串
    echo 'hello string'
    echo "hello\" ${your_name}\""
    echo 'hello ${your_name}'
    # 字符串长度
    echo ${#your_name}
    # 截取字符串
    echo ${your_name:1:4}
    # 查找字符串
    echo `expr index "$your_name" a`
    
    # 3.shell 数组
    array_name=(value0 value1 value2 value3)
    echo ${array_name[0]}
    echo ${array_name[@]}
    echo ${#array_name[*]}
    echo ${#array_name[0]}
    
    # 4.多行注释
    :<<!
    echo 1
    echo 2
    echo 3
    echo 4
    !
    
    • shell 参数传递
    #!/bin/bash
    # shell 传递参数
    echo "shell 传递参数示例"
    echo "执行文件名: $0"
    echo "第一个参数:$1"
    echo "第二个参数:$2"
    echo "第三个参数:$3"
    
    echo $#
    echo $*
    echo $$
    echo $!
    echo $@
    echo $-
    echo $?
    
    # $* 和 $# 区别
    # 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
    echo "--- \$* 演示 ---"
    for i in "$*"; do
        echo $i
    done
    
    echo "--- \$@ 演示 ---"
    for i in "$@"; do
        echo $i
    done
    
    • shell 数组
    #!/bin/bash
    # shell 数组
    my_array[0]=A
    my_array[1]=B
    my_array[4]=C
    
    echo "数组的个数为:${#my_array[*]}"
    echo ${my_array[0]}
    echo ${my_array[@]}
    echo ${my_array[2]}
    
    • shell 运算符
    #!/bin/bash
    # shell 基本运算符
    
    #1.算数运算符
    a=10
    b=20
    echo "1.算数运算符"
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ] #必须带空格 方括号和变量之间也需要
    then
        echo "a 等于 b"
    fi
    
    if [ $a != $b ]
    then
        echo "a 不等于b"
    fi
    
    
    #2.关系运算符
    echo "2.关系运算符"
    if [ $a -eq $b ]
    then
        echo "$a 等于 $b"
    fi
    
    if [ $a -ne $b ]
    then
        echo "$a 不等于 $b"
    fi
    
    if [ $a -gt $b ]
    then
        echo "$a 大于$b"
    fi
    
    if [ $a -lt $b ]
    then
        echo "$a 小于 $b"
    fi
    
    if [ $a -ge $b ]
    then
        echo "$a 大于等于 $b"
    fi
    
    if [ $a -le $b ]
    then
        echo "$a 小于等于 $b"
    fi
    
    
    #3.布尔运算符
    echo "3.布尔运算符"
    if [ $a -lt 100 -a $b -gt 15 ]
    then
        echo "$a 小于 100 且 $b 大于 15"
    fi
    
    if [ $a -lt 100 -o $b -gt 30 ]
    then
        echo "$a 小于100 或 $b 大于 30"
    fi
    
    
    #4.逻辑运算符
    echo "4.逻辑运算符"
    if [[ $a -lt 100 && $b -gt 15 ]]
    then
        echo "$a 小于 100 且 $b 大于 15"
    fi
    
    if [[ $a -lt 100 || $b -gt 30 ]]
    then
        echo "$a 小于100 或 $b 大于 30"
    fi
    
    #5.字符串运算符
    echo "5.字符串运算符"
    c="abc"
    d="efg"
    
    if [ $a == $b ]
    then
        echo "$a == $b "
    fi
    
    if [ $a != $b ]
    then
        echo "$a != $b"
    fi
    
    if [ -z $a ]
    then
        echo "$a 长度为0"
    fi
    
    if [ -n "$a" ]
    then
        echo "$a 长度不为0"
    fi
    
    if [ $a ]
    then
        echo "$a 不为空"
    fi
    
    #6.文件测试运算符
    echo "6.文件测试运算符"
    file="/search/odin/yangchuankun/shell/operator.sh"
    if [ -r $file ]
    then
        echo "文件可读"
    else
        echo "文件不可读"
    fi
    
    if [ -w $file ]
    then
        echo "文件可写"
    else
        echo "文件不可写"
    fi
    
    if [ -x $file ]
    then
        echo "文件可执行"
    else
        echo "文件不可执行"
    fi
    
    if [ -f $file ]
    then
        echo "文件为普通文件"
    else
        echo "文件为目录or 设备文件"
    fi
    
    if [ -d $file ]
    then
        echo "文件为目录"
    else
        echo "文件不是目录"
    fi
    
    if [ -s $file ]
    then
        echo "文件不为空"
    else
        echo "文件为空"
    fi
    
    if [ -e $file ]
    then
        echo "文件存在"
    else
        echo "文件不存在"
    fi
    
    • shell echo 命令
    #!/bin/bash
    # echo 命令
    # 显示变量
    echo "1.显示变量"
    read name
    echo "$name it is a test"
    
    # 显示换行
    echo "2.显示换行"
    echo "OK! \n"
    echo -e "OK! \n" # 不加 -e 不转义
    echo "It is a test"
    
    
    echo "3.显示不换行"
    echo "OK! \c" # 不加 -e 不转义
    echo -e "OK! \c"
    
    echo "it is a test"
    
    
    echo "4.显示结果定向到文件"
    echo "it is a test" > myfile # 文件不存在则创建
    
    echo "5.原样输出字符串,不进行转移或取变量(用单引号)"
    echo '$name\"'
    
    echo "6.显示命令执行结果"
    echo `date`
    
    • printf命令
    #!/bin/bash
    
    echo "printf命令"
    
    printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
    printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
    printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
    printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
    
    
    
    # format-string 为双引号
    printf "%d %s \n" 1 "abc"
    # 单引号和双引号效果一样
    printf '%d %s \n' 1  "abc"
    # 没有引号也可以输出
    printf %s abcd
    
    # 格式只制定了一个参数,但是多出的参数仍然会按照该格式输出,format-string 被重用
    printf %s abc edf
    
    printf "%s\n"  abc def
    
    printf "%s %s %s\n" a b c d e f g
    
    # 如果没arguments , 那么%s 用null 代替, %d 用0代替
    printf "%s and %d \n"
    
    
    printf "a string , no processing:<%s>\n" "A\nB"
    printf "a string , no processing:<%b>\n" "A\nB" # %b展开参数中的反斜杠转义字符
    
    printf "abc string \a" #警告字符
    
    • test 命令
    #!/bin/bash
    # Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
    
    echo "1.数值测试"
    num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
        echo "两数相等"
    else
        echo "两数不相等"
    fi
    
    echo "代码中的 [] 执行基本的算数运算,如:"
    a=5
    b=6
    result=$[a+b]
    echo "result 为 $result"
    
    
    echo "2.字符串测试"
    
    string1="abc"
    string2="abd"
    
    if test $string1 = $string2
    then
        echo "两字符串相等"
    else
        echo "两字符串不相等"
    fi
    
    
    echo "3.文件测试"
    cd /bin
    if test -e ./bash
    then
        echo "文件存在"
    else
        echo "文件不存在"
    fi
    
    # Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。
    
    cd /bin
    if test -e ./notfile -o -e ./bash
    then
        echo "至少一个文件存在"
    else
        echo "两个文件都不存在"
    fi
    
    • 流程控制
    #!/bin/bash
    echo "流程控制"
    
    echo "1.if then else if 结构 前面很多不示例"
    
    echo "2.for 循环"
    for loop in 1 2 3 4 5
    do
        echo "the value is : $loop"
    done
    
    for str in 'this is s string'
    do
        echo $str
    done
    
    echo "3.while 循环"
    int=1
    while(( $int<=5 ))
    do
        echo $int
        # let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
        let "int++"
    done
    
    # 读取键盘信息
    :<<EOF
    echo "按下<CTRL-D>退出"
    echo -n "输入你最喜欢的网站名" # echo -n 不换行输出
    while read FILM
    
    do
        echo "是的,$FILM 是一个好网站"
    done
    EOF
    
    # 无限循环
    # while : 或 while true 或 for (( ; ; ))
    
    
    echo "4.until循环"
    # until 循环执行一系列命令直至条件为 true 时停止。
    a=0
    
    until [ ! $a -lt 10 ]
    do
        echo $a
        a=`expr $a + 1`
    done
    
    echo "4.case 结构"
    # case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
    :<<EOF
    echo "请输入1到4之间的数字"
    echo "你输入的数字为:"
    read aNum
    case $aNum in
        1) echo '你选择了1'
            ;;
        2) echo '你选择了2'
            ;;
        3) echo '你选择了3'
                ;;
        4) echo '你选择了4'
            ;;
        # 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
        *) echo '你没有输入 1到4 之间的数字'
            ;;
    esac
    EOF
    
    echo "5.break"
    :<<EOF
    while :
    do
        echo '输入 1 到 4 之间的数字:'
        echo '你输入的数字为:'
        read aNum
        case $aNum in
                1)  echo '你选择了 1'
                ;;
                2)  echo '你选择了 2'
                ;;
                3)  echo '你选择了 3'
                ;;
                4)  echo '你选择了 4'
                ;;
                *)  echo '你没有输入 1 到 4 之间的数字'
                break
                ;;
        esac
    done
    EOF
    
    echo "6.continue"
    :<<EOF
    while :
    do
        echo -n "输入 1 到 5 之间的数字: "
        read aNum
        case $aNum in
            1|2|3|4|5) echo "你输入的数字为 $aNum!"
            ;;
            *) echo "你输入的数字不是 1 到 5 之间的!"
                continue
                echo "游戏结束"
            ;;
        esac
    done
    EOF
    
    • shell 函数
    #!/bin/bash
    # shell 函数
    
    demoFun(){
        echo "这是我第一个shell函数"
    }
    
    demoFun
    
    funWithReturn(){
        echo "这个函数会对输入的两个数字相加"
        echo "输入第一个数字:"
        read aNum
        echo "输入第二个数字:"
        read bNum
        echo  "两个数字分别为 $aNum 和 $bNum"
        return $(($aNum+$bNum))
    
    }
    
    funWithReturn
    echo "输入的两个数字之和为 $? !" # 函数返回值在调用该函数后通过 $? 来获得。
    
    
    funWithParam(){
        echo "第一个参数为 $1"
        echo "第二个参数为 $2"
        echo "第十个参数为 $10 "
        echo "第十个参数为 ${10}"
        echo "第十一个参数为${11}"
        echo "参数总数有 $# 个"
        echo "作为一个字符串输出所有参数 $* "
    
    
    }
    
    funWithParam 1 2 3 4 5 6 7 8 9 111 222
    

    相关文章

      网友评论

          本文标题:Shell 学习

          本文链接:https://www.haomeiwen.com/subject/fcvjyktx.html