bash编程_拔剑-浆糊的传说_新浪博客

1. bash 函数参数


2. bash for 循环

3. 计算数组的个数,字符串长度,访问特定成员
${#array_name[@]}
${#array_name[*]}


4. shell数值计算

    Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2。

    为了解决这一问题,有如下几种方案。
    (1)运算符[ ]
        a=2
        b=3
        c=$[a+b]
        d=$[a-b]
        e=$[a*b]
        f=$[a/b]
        g=$[a%b] 
    $符只是取变量值的意思。中括号和里面的表达式可以视作一个变量。在中括号中引用变量可以直接使用变量名,也可以使用$加变量名。比如:

        c=$[$a+$b]  
    (2)计算立即整数
        c=$[2+3]
        d=$[2-3]
        e=$[2*3]
        f=$[2/3]
(3)expr及其反引用,expr是一个外部命令(非Bash本身的命令),所以它是独立与Bash的,同样可以在其他Shell中使用。
        a=2
        b=3
        expr $a + $b
        expr $a - $b
        expr $a \* $b
        expr $a / $b
        expr $a % $b
        
    需要注意的是:
        —— 操作符和操作数之间一定要有空格间隔
        —— 操作数(即变量)前必须有$符
        —— 乘号*,要用反斜杠\进行转义
        —— 该命令会将计算结果打印到标准输出
        —— 仅支持整数运算
        —— 也可以直接使用数字的字面值
        —— expr除了支持以上运算外,还支持其他运算,大家可以自行 man expr来查看。
  (4)用bc进行浮点数运算
    —— 基本格式
        以上我们介绍的各种数值计算方案,不管是shell内部的还是外部的,都有一个问题,那就是不支持小数运算。这应该是shell本身的使用环境所决定的,实际在脚本中进行小数运算的情况可能并不多。
        如果我们想进行浮点数的运算该怎么办呢?答案是利用外部工具(或者说命令)bc。bc是一个交互式的计算器。你可以在shell中键入bc来进入bc的命令提示符。但同样bc也支持写入到脚本中来进行数值计算。这需要用到管道,所谓管道就是将前一个命令的标准输出,作为标准输入传递给后面的命令。关于管道的更多概念,在以后讲IO操作的时候会提及。
                echo '45.36-22.33'|bc
         单引号双引号,这里无所谓。实现的过程就是将一个数学表达式传递给bc这个计算器。然后bc会将结果打印到标准输出。
    —— 设置精度
        浮点运算,有一个很重要的概念就是精度。bc这里的精度指的的是小数的位数。在使用bc来进行除法运算的时候,你会发现默认是取整的,即没有小数部分。
        比如:echo '2/3'|bc,它输出的是0。因为bc的默认精度是0。你可能会想到的解决方案是:echo '2.0/3'|bc。但是输出结果依旧是0。
        其他运算,比如加、减和乘。都会自动取操作数中的最大精度为输出结果的精度。
                echo '2.0*3.00'|bc
                echo '2.25+4.5'|bc
                echo '5.66-7.888'|bc
        输出结果为:
            6.00
            6.75
            -2.228
        但是除法不行,你必须手动设置。
             echo 'scale=3;2/3'|bc
            .666
            .666为输出的结果。因为设置了精度scale=3。前导0会被忽略。
        bc功能强大,你甚至能直接利用bc来进行进制转换。

(5)字符串操作

装载自:http://my.oschina.net/aiguozhe/blog/41557

http://my.oschina.net/aiguozhe/blog/41557


1. 取长度

    str="abcd"

    expr length $str   # 4

    echo ${#str}       # 4

    expr "$str" : ".*" # 4

    好像一般使用第二种

2. 查找子串的位置

    str="abc"

    expr index $str "a"  # 1

    expr index $str "b"  # 2

    expr index $str "x"  # 0

    expr index $str ""   # 0

3. 选取子串

    str="abcdef"

    expr substr "$str" 1 3  # 从第一个位置开始取3个字符, abc

    expr substr "$str" 2 5  # 从第二个位置开始取5个字符, bcdef 

    expr substr "$str" 4 5  # 从第四个位置开始取5个字符, def

     

    echo ${str:2}           # 从第二个位置开始提取字符串, bcdef

    echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd

    echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde

    echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde

 


4. 截取子串 

    str="abbc,def,ghi,abcjkl"

    echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)

    echo ${str##a*c}    # 输出jkl,             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)

    echo ${str#"a*c"}   # 输出abbc,def,ghi,abcjkl 因为str中没有"a*c"子串

    echo ${str##"a*c"}  # 输出abbc,def,ghi,abcjkl 同理

    echo ${str#*a*c*}   # 空

    echo ${str##*a*c*}  # 空

    echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl, 

    echo ${str#*d*f}    # 输出,ghi,abcjkl   

     

    echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配 

    echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配

    echo ${str%a*c}     # abbc,def,ghi,abcjkl

     可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)    :-)


5. 字符串替换 

    str="apple, tree, apple tree"

    echo ${str/apple/APPLE}   # 替换第一次出现的apple

    echo ${str//apple/APPLE}  # 替换所有apple

     

    echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它

    echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它

 


6. 比较

    [[ "a.txt" == a* ]]        # 逻辑真 (pattern matching)

    [[ "a.txt" =~ .*\.txt ]]   # 逻辑真 (regex matching)

    [[ "abc" == "abc" ]]       # 逻辑真 (string comparision) 

    [[ "11" < "2" ]]           # 逻辑真 (string comparision), 按ascii值比较

 

7. 连接 

    s1="hello"

    s2="world"

    echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号

  

   判断字符串为空

 

   if [ -z "$str" ]; then

 

         echo "empty string"

   fi


fi


 (6) 参数

https://blog.csdn.net/geoffreychan/article/details/77823505

—— 位置参数变量是标准的数字:$0是程序名,$1是第一个参数,$2是第二个参数,类推。

—— 变量$#会自动获取命令行参数的数量,现在通过一个例子观察其用法:

//==========================================================

#shell判断文件夹是否存在

#如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
 
mkdir /myfolder
fi #shell判断文件,目录是否存在或者具有权限 folder="/var/www/"
file="/var/www/log"

#
-x 参数判断 $folder 是否存在并且是否具有可执行权限
if [ ! -x "$folder"]; then
 
mkdir "$folder"
fi

#
-d 参数判断 $folder 是否存在
if [ ! -d "$folder"]; then
 
mkdir "$folder"
fi

#
-f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
 
touch "$file"
fi

#
-n 判断一个变量是否有值
if [ ! -n "$var" ]; then
 
echo "$var is empty"
  exit
0
fi

# 判断两个变量是否相等
if [ "$var1" = "$var2" ]; then
 
echo '$var1 eq $var2'
else
 
echo '$var1 not eq $var2'
fi

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值