变量、变量类型
shell的数据类型主要有字符串,整数,数组,至于浮点数很少使用。变量的定义和使用如下:
str="abc def"
ivalue=123
arr=(1 2 3 4)
echo ${str}
echo ${ivalue}
echo ${arr[@]}
并且整数和字符串是随语境自动转化的,请看下面的栗子:
a="10"
b=20
c=`expr ${a} + ${b}`
echo ${c}
变量a是字符串,变量b是整数,但是expr是求表达式结果的命令,期待所有的参数是整数,所以执行的时候会先尝试都转到整数,如果转化成功则执行,否则报错。数字转字符串同理。
a=10
echo "${a}abc"
shell中的数组则是可变,数组的访问和属性如下:
arr=(1 2 3)
# 数组长度
echo ${#arr[@]}
echo ${#arr[*]}
# 访问数组的元素
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
# 数组变为一个字符串,用空格分开
echo ${arr[*]}
# 数组本身
echo ${arr[@]}
# 数组的遍历,这里有一个小细节要注意
# 遍历${arr[*]},并且不用引号包括
for i in ${arr[*]}
do
echo $i "abc"
done
# 结果如下:
# 1 abc
# 2 abc
# 3 abc
# 遍历${arr[*]},并且用引号包括
for i in "${arr[*]}"
do
echo $i "abc"
done
# 结果如下:
# 1 2 3 abc
# 遍历${arr[@]},并且不用引号包括
for i in ${arr[@]}
do
echo $i "abc"
done
# 结果如下:
# 1 abc
# 2 abc
# 3 abc
# 遍历${arr[@]},并且用引号包括
for i in "${arr[@]}"
do
echo $i "abc"
done
# 结果如下:
# 1 abc
# 2 abc
# 3 abc
数组的插入可以直接用[]。如下:
arr=()
for i in `seq 0 5`
do
arr[$i]=$i
done
echo ${arr[@]}
# 0 1 2 3 4 5
运算
- 算术运算
a=10
b=20
# 加号左右有空格,结果为30
echo `expr ${a} + ${b}`
# 如果没有空格当做字符串处理,结果为"10+20"
echo `expr ${a}+${b}`
# +号可以换成 - \* / % == !=
- 逻辑运算
&& 和 ||用法和其他语言的一致。
a=10
if [ ${a} -gt 5 ] && [ ${a} -lt 20 ]; then
echo "5 < a={$a} < 20"
fi
- 关系运算
关系运算只支持整数,不支持字符串,除非这个字符串可以成功转化为整数。
a=10
b="20" # 可以转化为整数的字符串
if [ ${a} -gt ${b} ];then
echo "a=${a} is big than b=${b}"
fi
# -gt可以换成-lt -eq -ne -ge -le
- 布尔运算
! -o -a表示非、或、与
a=10
if [ ! ${a} -gt 5 -a ${a} -lt 100 ]; then
echo "balabala"
fi
字符串运算
$ -z -n == !=
# $判断字符串是否包含非空白字符
# -z判断字符串是否仅由空白字符组成
# -n判断字符串是否包含字符,测试字符必须需要用""包括,否则永为真
if [ - n "${a}" ];then
echo "balabal"
fi
test命令
-r -w -x -f -d -s -e
file_name="./a.sh"
if test -r ${file_name};then
echo "readable"
fi
if [ -r ${file_name} ];then
echo "readable"
fi
执行命令
执行的命令需要被反引号包括(ESC下面那个键)
echo `pwd`
echo `expr 2 + 2`
流程控制
- if
a="./test.sh"
if [ -x ${a} ]; then
echo "excuable"
elif [ -w ${a} ]
then
echo "writeable"
else
echo "other"
fi
- for
st="ab cd ef"
for i in ${st}
do
echo $i
done
arr=(1 1 2 3 4)
for i in ${arr[@]}
do
echo $i
done
for ((i=0;i<10;i++))
do
echo $i
done
- while
while true
do
if [ ${a} > 10 ];then
break
fi
echo ${a}
a=`expr ${a} + 1`
done
while (( ${a}<10 ))
do
echo "small"
a=`expr ${a} + 1`
done
- case
a=0
case ${a} in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo ${a}
;;
esac
函数
function say_hello()
{
echo "hello "$1
}
say_hello "abc"
function add()
{
return `expr $1 + $2`
}
add 1 2
a=$?
echo ${a}
网友评论