通过一个整合了常用Shell脚本的命令的例子来快速上手Shell,达到可以写简单脚本和Shell脚本阅读的目的:
#!/bin/bash
#自学shell编程基本语句的demo例子集合
#20170616
echo "Hello World !"
#变量,变量名与等号之间不能有空格
your_name="krs"
#使用一个定义过的变量,只要在变量前加$美元符即可
echo ${your_name}
#只读变量,使用readonly命令可以将变量定义为只读变量,只读变量的状态不能改变
readonly myUrl="www.dd.cc"
#删除变量,变量被删除之后不能被再次使用,unset指令不能删除只读变量
unset your_name
#Shell字符串,可以使用单引号(原样输出,单引号中的变量是无效的)或者双引号(双引号里可以有变量)
your_name='qin'
str='this is a String'
str_double="Hello,${your_name}"
echo str_double
#获取字符串长
string="abcd"
echo ${#string}#输出4
#提取子字符串
echo ${str:1:3}#输出his,注意是从0开始计数
#Shell数组,bash支持一维数组(不支持多维数组),并且没有限定数组大小
#定义数组,在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为
array_name=("zara" "dsaf" "dasfsad")
array_name[4]="dsdf"
array_name[6]="sdafrg"#可以使用不连续的下标,而且下标的范围没有限制
#读取数组,一般格式${array_name[index]}
echo "First Index: ${array_name[1]}"
#获取数组的长度
length=${#array_name[*]}#或者${#array_name[@]}
#获取数组单个元素的长度
lengthn=${#array_name[3]}
#Shell预设变量
for i in "$*";do
echo $i
done
#Shell基本运算符,原生的bash不支持简单的数学运算,但是可以通过awk和expr等指令来实现
#expr是表达式计算工具,可以完成表达式求值
#表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
val=`expr 2 + 2`
echo "两数之和为 : $val"
a=2
b=2
#条件表达式要放在方括号之间,并且要有空格
if [ $a == $b ]
then
echo "a等于b"
fi
if [ $a != $b ]
then
echo "a不等于b"
fi
#乘法的特殊性,乘号(*)前边必须加反斜杠(\)才能实现乘法运算
val=`expr $a \* $b`
echo "a * b : $val"
#关系运算符
#-eq是否相等,相等返回true
#-ne是否相等,不相等返回true
#-gt左边大于右边返回true
#-lt左边小于右边返回true
#-ge左边大于等于右边返回true
#-le左边小于右边返回true
#布尔运算符
# !非运算
# -o 或运算
# -a 与运算
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : 返回 true"
else
echo "$a -lt 100 -o $b -gt 100 : 返回 false"
fi
#逻辑运算符
# && 逻辑的AND
# || 逻辑的OR
#字符运算符
# = 检测两个字符串是否相等,相等返回true
# != 检测两个字符串是否相等,不相等返回true
# -z 字符串长度为0返回true
# -n 字符串长度不为0返回true
#printf ,默认printf不会像 echo 自动添加换行符
#语法 printf format-string [arguments...]
#format-string: 为格式控制字符串
#arguments: 为参数列表。
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
#%s %c %d %f都是格式替代符,
#%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
#%-4.2f 指格式化为小数,其中.2指保留2位小数。
#不换行
printf %s ab
# 没有引号也可以输出
printf "%s\n" abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s %s %s\n" a b c d e f g h i j
#Shell流程控制,shell的流程控制不可为空
#if语句
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
#写成一行,适合作为终端命令: if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
#for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#while语句
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
#let:用来执行算数和数值表达式测试
i=1
echo "i="$i
let i=i+2
echo "i="$i
let "i=i+4"
echo "i="$i
#函数,函数返回值在调用该函数后通过 $? 来获得
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
#带有return语句的函数
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
#带参数的函数,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
funWithParam(){
echo "第一个参数为 $1 "
echo "第十个参数为 ${10} "
echo "参数总数为 $# 个"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 56 85 34