Linux入门之bash3
扫描二维码
随时随地手机看文章
逻辑运算符
&&,短路并,前面成立才执行后面的操作
||,短路或,前面不成立才执行后面的操作
[ 1 -ge 2 ] && echo '>=' || echo '<',1小于等于2不成立,所以执行 echo '<'
算术运算
((c=a+b)),支持整数的四则运算,%取模,++,--,*=,/=
c=$(expr a + b),*要写做 \*转义
let c=a+b,命令行,表达式中间不能有空格
c=$[a+b]
$RANDOM,随机整数
echo 'scale=2;5/3' |bc,浮点计算,bash算术运算不支持浮点,bc支持
函数
变量FUNCTION代表当前正在执行的函数名
$0,脚本名,$1,第一个参数,$2,第二个参数,$@所有参数,$#参数个数
$*是保存所有参数的字符串,而$@是数组
$*不用""包裹时,for x in $*,会被扩展为数组做迭代,"$*"仍被当做字符串
函数调用时不加括号,后面直接跟参数
func() {
echo $FUNCNAME
echo $0, $1, $2, $@, $#, $*
}
func a b c d
有function函数名称后面可以省略()
bash默认所有变量都是全局的,跟python刚好相反
local v,声明这个变量是局部变量,后面就按局部变量处理
v=1
function func2 {
echo v_old, $v
local v
echo v_new, $v
}
脚本
脚本的第一行是解释器说明,不写使用默认shell
脚本的参数传递规则和函数的参数传递规则一致
#! /bin/bash
echo $0, $1, $#, $@, $*
if判断
if根据测试条件执行对应的表达式,如果then跟if写在一行,要用 ; 隔开
if [ $a -lt 2 ]; then
echo '2'
elif [ $a -lt 3 ]; then
echo 3
else
echo 5
fi
test "$a" = "$b",测试a和b是否相同,变量值中间没有空格,双引号可以省略,=可以写成==
[ $a != $b ],测试字符串不同,用[]代替 test,表达式之间必须有空格
[ $a \> $b ],按ascii码比较字符串大小,\<小于
[ -n $str ],字符串非空,长度不为0
[ -z $str ],字符串空,长度为0
[ $a -eq $b ],数值判断,-eq等,-ne不等,-gt大于等于,-ge,-lt,-le,具体man test
[ -f './f' ],当前目录下是否有名为f的普通文件,-d 判断目录,-e仅测试文件存在,不管文件是普通文件,目录或者块设备
[ -z $str -a -n $str2 ],str为空 并且 str2不为空
[ -z $str -o -n $str2 ],str为空 或 str2不为空
[ ! -z $str ],非 str为空,即str不为空
[[ $a == c* ]],字符串a是否已c开头,[[]]中字符串大小比较直接用><,[[]]比[]扩展性好
for循环
"$*",不会被扩展,所以显示一个字符串
$*,被扩展,会按照字符串中的空格断句
for v in "$*"; do
echo $v
done
类c循环
for((i=0; i<=$#; i++)); do
echo $i
done
while循环
a=4
b=10
while [ $a -le $b ]
do
echo $a
a=$[a+1]
done
死循环,while [ 1 ]可以写成while :
while [ 1 ]
do
# 每循环一次,参数列表向左移动3位
shift 3
echo $1, $#
# 死循环必须设置退出条件,否则会一直循环下去
if [ $# -le 3 ]; then
break
fi
sleep 0.2
done
case
类似其他编程语言的switch
通配符如ab,ab*等,不能加引号
a=abc
case $a in
'ab')
echo 'ab';;
a*)
echo 'a*'
;;
*)
echo 'other';;
esac