shell语法

shell

基础语法

变量:test="hhhh",注意赋值的等号前后不能有空格,不然可能识别为等值判断
使用变量:echo "the string is" ${test}

数组
  1. arrname[1]=1;arrname[4]="hhh"数组成员类型可以不同且没有长度限制,也可以一次性定义

    array_name=(value0 value1 value2 value3)
    
  2. arrname[@]arrname[*]
    两个都表示数组的所有值,也都可在里面遍历

    @和*的对比主要是前者输出是行,后者输出以空格隔开

  3. 可以使用循环for遍历

    for i in ${arr[@]}
    do 
    echo ${i}
    done
    
  4. 获取长度echo ${#arr[@]},下标使用*号也可以

字符串
  1. 和python一样支持截取echo ${hhh:1:3},打印字符串1到3的索引
  2. 打印字符串长度echo ${#hhh}
  3. 获取指定字符的匹配索引echo `expr index "${hhh}" "1"`注意不是单引号是反引号

特殊符号

  1. {}:用来包围,界定范围,可以不加,但是为了方便界定和阅读最好加上
  2. ():括号内如果是代码则会执行;egfor i in $(ls ../); do echo ${i} ; done;,会把ls的执行结果遍历打印出来
  3. 单引号和双引号,单引号内部所有字符没有任何效果,双引号则相反,都可以用于字符串合并,eg
    arr[1]=1
    arr[5]="jijojo"
    arr[3]="jise"
    hhh='test'${arr[3]}"test"${arr[1]}
    echo $hhh
    
    result:testjisetest1

循环&判断

  1. for

     for i in ${arr[*]}
     do 
     echo ${i}
     done
    

    写成一行for i in ${arr[*]} ;do [command 1] ;[command 2] ;...;done;,egfor i in ${arr[*]} ;do echo ${i};echo hhhhhh;done;

    注意写一行的时候分号需要加的位置,除了do后面之外基本都要加

    其中遍历对象也可以是常用linux指令的输出值,只要输出方式是遍历输出就可以,如下

     for i in $(ls ../)
     do
     echo "the file name is :" ${i}
     done
    

    上面可以指定路径下的文件名遍历。或者可以直接用参数遍历

     for i in 1 2 3 4
     do 
     echo ${i}
     done
    

    能够顺序打印出定义的数字

  2. if

     if [[ $1 = $2 ]]
     then
     echo "equal"
     ...
     elif
     then
     ...
     else 
     echo "noeq"
     ...
     fi
    

    同样可以写成一行
    if [[ $1 = $2 ]];then echo "equal" ;else echo "noeq";fi;
    分号规则和for是类似的,另外只有出了fi才算结束判断过程,要运行多个指令可以直接插入(如上省略号)。此外,如果在使用[[作为判断界定时,有时候会收到[[: not found的错误,这是因为使用sh [shell.sh]语法导致的,在一些系统里面默认使用dash作为sh指令的实现而不是bash,解释器的差异导致了这个问题,但如果直接使用./[shell.sh] 执行时又不会报错

    判断规则参考
    关系运算符
    Shell 中的中括号用法总结

    主要掌握
    [[ -n $arg ]]:arg非空,以下省略双括号

    关系运算

    运算符说明举例
    -eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
    -ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
    -gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
    -lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
    -ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
    -le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

    字符串运算

    运算符说明举例
    =检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
    !=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ] 返回 true。
    -z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
    -n检测字符串长度是否不为 0,不为 0 返回 true。[ -n “$a” ] 返回 true。
    $检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

    文件操作

    操作符说明举例
    -b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
    -c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $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。
  3. while

     while condition
     do
         command
     done
    

    无限循环

     while :
     ....
    
  4. break 和 continue的使用和c差不多
    break

     while :
     do
         echo -n "输入 1 到 5 之间的数字:"
         read aNum
         case $aNum in
             1|2|3|4|5) echo "你输入的数字为 $aNum!"
             ;;
             *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
                 break
             ;;
         esac
     done
    

    continue

     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
    

函数

  1. 定义
    [ function ] funname [()]
    {
    
        action;
    
        [return int;]
    
    }
    
    返回值只可以是【0-255】的数值,超过了就重新计数,可以跨文件调用,返回值可以是符合范围的数值参数return $value
    示例
    test.sh
    . ./test2.sh
    echo "my first function"
    demoFun hhhh
    echo "end of demo function ret ="$?
    otherFun jiii
    echo "end of other function ret ="$?
    
    获取返回值通过$?
    test2.sh
    demoFun(){
    echo "这是我的第一个 shell 函数!"
    echo "the value is"${1}
    return 2
    }
    
    otherFun(){
        echo "the next function value"${1}
        h=122
        return $h
    }
    
    获取传入参数和一般的获取参数一样使用${n}
    result
    my first function
    这是我的第一个 shell 函数!
    the value ishhhh
    end of demo function ret =2
    the next function valuejiii
    end of other function ret =122
    
    注意,每次通过$?得到返回值的时候,要第一时间保存,不然会被覆盖
    其他相关的参数处理特殊字符
    参数处理说明
    $#传递到脚本或函数的参数个数
    $*以一个单字符串显示所有向脚本传递的参数
    $$脚本运行的当前进程ID号
    $!后台运行的最后一个进程的ID号
    $@与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $-显示Shell使用的当前选项,与set命令功能相同。
    $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

算术计算

尽管在sh里面用算数计算少,但还是记录下

  1. 使用expr指令后可以用于计算expr 1 + 2,可以参数化````expr ${1} + ${2}` ```注意空格的使用,没有空格就成字符串连接了。
  2. 使用括号包围
    相当于执行命令,所以可以用于计算
    h=$((${1}+${2}))
    echo "the value "$h
    
    1 , {1}, 1,{2}是文件输入参数来的,相当于可以用来计算传递给函数的值。也能写复杂的计算公式echo "the value is " $((10*(39+1)+365/5))

注释

  1. #
  2. 使用包围
     :<<!
     要被注释的内容
     ...
     !
    
    其中的感叹号可以替换成其他符号

注意点

  1. shell 对 空格和;的要求很高,等号前后没有空格是赋值,有空格是比较,所以允许一个等号的对比[[ $num1 = $num2 ]]
  2. 在使用变量的时候,变量结构前后最好有空格,不然会报错
    egif [[${num} = ${num2}]],这样是会报错的,因为[[${num}在运行后变成[[num导致语法错误

shell 重定向

参考Shell 输入/输出重定向

文件包含

使用.来引入.sh文件,eg . ./test.sh将同目录下的test.sh文件引入,这样就能使用test.sh里面的东西

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值