bash编程笔记
使用bash的shell编程之前,需要熟练使用linux的bash命令。如果还不太熟悉,建议多使用使用linux之后,再来看看这篇文章。
基本变量
普通变量
bash的所有的变量为无类型变量,例如下面的赋值语句都可:
var1=haha
var2=123
var3=haha123
字符数组
bash的数组赋值语句如下,调用使用[n]指定元素即可,获取所有元素为[@],获取元素的个数为${#list[@]},例句如下:
list=(aa bb cc dd)
echo ${list[1]} # print string 'bb'
echo ${list[@]} # print string 'aa bb cc dd'
echo ${#list[@]} # print 4
获取参数及程序运行完成后的状态
bash脚本程序的参数列表使用$加数字形式来获取,例如运行program.sh脚本:
program.sh a b c d
获得第一个参数为$1获得数值为a,$0为program.sh
,获得所有参数列表为$@,获得所有参数的个数为$#,例如编写如下bash脚本:
#! /bin/bash
echo arguments list is: $@ # print string 'a b c d'
echo number of arguments is: $# # print 4
echo value of second arguments is: $1 # print a
获取一个上一个shell里面的程序完成的状态变量为: $?
获取当前shell的进程号
echo $$
字符拼接
获得变量的数值时,方法为$后跟上变量名,也可以${变量名},后一种情况用于容易引起歧义的地方。字符串常用"“或者’'装起来。但双引号和单引号有点区别,”"双引号加入变量会扩充,‘’单引号则不会,例如如下代码:
value=wahaha
echo "haha $value" # print string 'haha wahaha'
echo "haha ${value}" # print string 'haha wahaha'
echo 'haha $value' # print string 'haha $value'
读取控制台输入与输出
获得一个命令的结果,并将结果作为字符串变量的方法为,`命令`或者 $(命令)。注意,这里的``为反引号。例如当前目录下面的文件为aa,bb,cc三个文件,有下面的示例:
res1=`ls`
res2=$(ls)
echo $res1 # print 'aa bb cc'
echo $res2 # print 'aa bb cc'
获得程序运行时用户的控制台输入为:
read -p "input your content: " value
# then if you input a string 'haha'
echo $value # print haha
条件判断与常用比较
条件语句:
if [ expression ] ; then
echo one
elif [ expression ] ; then
echo two
else
echo three
fi
bash常用比较为[ compare_commands ]或者[[ compare_commands ]]。注意,一个中括号时,括号内部两边必须要有空格,两个中括号没有要求。
常用比较语句:
文件操作 | |
---|---|
[ -e file ] | 如果file存在时为真 |
[ -f file ] | 如果file是普通文件时为真 |
[ -d file ] | 如果file是目录时为真 |
[ -x file ] | 如果file存在且可执行时为真 |
字符串操作(一般使用双引号包含起来字符串,不然变量有空格时会出意想不到的错误) | |
---|---|
[ -z string ] | string是否为空 |
[ -n string ] | string是否为非空 |
[ string1 == string2 ] | 相同 |
[ string1 != string2 ] | 不同 |
[ string1 < string2 ] | 小于 |
[ string1 > string2 ] | 大于 |
数值判断 | |
---|---|
[ int1 -eq int2 ] | 相等 |
[ int1 -ne int2 ] | 不等 |
[ int1 -gt int2 ] | 大于 |
[ int1 -ge int2 ] | 大于等于 |
[ int1 -lt int2 ] | 小于 |
[ int1 -le int2 ] | 小于等于 |
逻辑判断 | |
---|---|
[ ! expression ] | 非 |
[ expression1 -a expression2 ] | 且 |
[ expression1 -o expression2 ] | 或 |
[ exporession1 ] && [ expression2 ] | 且 |
[ exporession1 ] || [ expression2 ] | 或 |
双圆括号(( )):表示数学表达式
在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,而且在双圆括号里面的’>’,’<'号不需要转意。
双方括号[[ expression ]]:表示高级字符串处理函数
双方括号中判断命令使用标准的字符串比较,还可以使用匹配模式,从而定义与字符串相匹配的正则表达式。注意使用正则表达式时==左右需要空格。
循环
c语言风格for循环
for ((i=1; i<=100; i++))
do
ans=$(( $ans + 1 ))
done
for in遍历元素
for file in `ls ./`
do
echo $file
done
基本数学计算
使用$(( $value1 op $value2 ))得到数学计算结果,注意使用的是整数操作。
i=1
i=$(( $i + 1 ))
echo $i # print 2