shell的使用技巧

一、引号的艺术

  单引号,双引号,无引号

  echo hello world    无引号时,无法使用bash的界定符如;

  echo 'hello world'    使用单引号echo时,bash不会对单引号内的变量求值,而是原样输出 

  echo "hello $world"  使用双引号时,会对引号内的变量求值

二、赋值与相等

  var = value  相等

  var=value  赋值

三、数学运算

  常用的数学运算如下(注意空格):

  v=1

  let v++

  let v+=6

  v=$[ v + 1 ](这里的空格可有可无)

  v=$[ $v + 1 ]

  v=$(( v + 1 ))(这里的空格可有可无)

  v=$(( $v + 1 ))

  v=`expr $v + 3 `(注意这里,+前后,3的后面都需要空格)

  v=`expr v + 3 `(这个是不行的,见上面)

  上面的数学运算只支持整形,不支持浮点运算

  浮点运算可以用bc

  echo "4 * 0.56" | bc

  echo "scale=2;3/8" | bc  设置精度为小数点后两位

  echo "obase=2;15" | bc  以二进制格式输出15,输出是1111

  echo "obase=10;ibase=2;1111" | bc  以十进制输入,以二进制输出,二进制输入1111,输出应该是15

  pi=$(echo "scale=10;4*a(1)" | bc -l)  输出圆周率pai的十位

  sin,cos,sqrt等也可以通过bc计算出来

四、字符串操作

  获取字符串长度:length=${#var}

  字符串比较----用两个中括号:[[]]

  [[ $str1 = $str2 ]]

  [[ -n $str1 ]] str1包含的是一个非空字符串,返回真

  [[ -z $str1 ]] str1是空字符串,返回真

  if [[ -n $str1 ]] && [[ -z $str2]];

  then

    command;

  fi

  五、切分文件名

  FILE="a.bc.df.xml"

  echo ${FILE%.*} ---->a.bc.df

  echo ${FILE%%.*} ---->a

  echo ${FILE#*.} ---->bc.df.xml

  echo ${FILE##*.} ---->xml

  如何记忆呢?

  (1).两个%%(##)是贪婪的,一个是否贪婪的

  (2).%#分别位于键盘的右边和左边。所以可以记为%中的正则匹配了右边的部分,#中的正则匹配了左边的部分。

  (3).注意这里.是可以被其他字符替代的,可以用一个文件名或者目录名替换

  文件名切分实例:

  匹配目录:路径为 path=/data/user/a.bc.df.xml  求:/data/user         答案:${path%/*}

  批量重命名当前目录下的*.jpg和*.png文件

  

#! /bin/bash

count=1
for img in *.jpg *.png
do
    new=image-$count.${img##*.}
    mv "$img" "$new"

    if [ $? -eq 0 ];
    then
        echo "Renaming $img to $new"
        let count++
    fi
done

  六、文件切片

  ${string:4}  打印第4个字符之后的内容

  ${string:4:8}  打印第5个字符开始,打印8个字符

  七、数组和关联数组

  赋值和初始化:

    array={[index1]=value1 [index2]=value2}

    array[index3]=value3

  

原文地址:https://www.cnblogs.com/pigerhan/p/2790701.html