一、引号的艺术
单引号,双引号,无引号
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