shell是一种解释型的脚本语言,通过它可以直接调用linux的命令来与linux交互;
需要注意,shell里面处理运算符号左右可以输入空格之外,进行行对齐等代码格式调整的时候,不要使用空格而是使用tab来控制缩进等,空格也会被bash当前命令处理,会报错;
1、shell是一种弱类型的语言,变量没有主动的类型声明;
2、shell的代码没有类似于java的{}和;来进行分隔的用法,关键字与其他代码之间必须有空格,代码相对简洁,但是可读性较差,举例 if 的写法如下;
shell:
if [ $a == $b ]
then
echo "a==b"
fi
Java:
if( a == b){
System.out.println( "a==b");
}
3、shell没有像Java里面的比如网络、文件等,而且通过Linux的系统命令来控制,所以学习shell要熟知Linux的命令;
word="Hello,World"
echo "the word is ${word}"
shell里面的数字使用部分整数、浮点数,但是需要注意的是常用的bc、expr、let三种计算方法,其中最常用的expr只能用于整数的计算,具体他们的用法见[shell里面的运算符]章节;
字符串的写法有两种:
单引号(单引号里面的内容会原样输出,转移字符、变量等无效):'my name is ${name}',输出my name is ${name}
双引号:"my name is${name}",输出my name is zhangsan
与字符串有关的操作:
获取字符串长度(Java : str.length()):${#str}
截取字符串(Java : str.substring(2,7)):#{str:3:5},从第三个元素开始截取5个长度的子字符串;
获取字符下标(Java : str.indexOf("h")):
判断是否包含子字符串(Java : str.contains("h")):
shell里面的数组初始化不需要定义长度,其长度可变,里面的元素类型不需要一致,目前只支持一维数组;
数组的定义(元素之间空格分开):arr_names=("zhangsan" "lisi" "wangwu")
数组的使用:${arr_names[0]}
数组的常用操作:
获取数组的所有元素:${arr_names[*]}
获取数组的长度:${#arr_names[*]}
获取数组中的第n个元素:${arr_names[n-1]}
删除数组中的第n个元素:unset arr_names[n-1](注意只是把n-1下标对应的数据置为空值,它的下标依然存在)
类型 | 用法 | 举例 | 是否支持复合运算 | 备注 |
expr命令 | score=`expr 88 + 99` | 否 | +号左右必须有空格 | |
let命令 | let score=88+99 | 是 | +号左右不能有空格; 如果要加空格,则必须使用双引号包裹运算 |
|
$[]方式 | score=$[88+99] | 是 | ||
$(())方式 | score=$((88+99)) | 是 |
类型 | 含义 | 举例 | 快速记忆 |
---|---|---|---|
-eq | 等于 | [ ${a} -eq ${b}] | equals |
-ne | 不等于 | 同上 | not equals |
-lt | 小于 | 同上 | less than |
-gt | 大于 | 同上 | greater than |
-le | 小于等于 | 同上 | less or equals |
-ge | 大于等于 | 同上 | greater or equals |
类型 | 含义 | 举例 | 快速记忆 |
---|---|---|---|
! | 取反 | [ !false ] | |
-o | 逻辑或 | [ ${a} -eq ${b} -o ${c} -eq ${d} ] | or |
-a | 逻辑与 | [ ${a} -eq ${b} -o ${c} -eq ${d} ] | and |
&& | 逻辑与 | [[ ${a} -eq ${b} -o ${c} -eq ${d} ]] | |
|| | 逻辑或 | [[ ${a} -eq ${b} -o ${c} -eq ${d} ]] |
需要注意后面两种是用[[]]包裹的,这种写法跟[]的区别,后面再细说;
类型 | 含义 | 举例 | 快速记忆 |
---|---|---|---|
= | 比较等于 | [ ${a} = ${b}] | |
!= | 比较不等于 | [ $[a] != ${b}] | |
-z | 长度是否为0 | [ -z str ] | zero |
-n | 长度是否不为0 | [ -n str ] | not zero |
str | 字符串是否为空 | [ str ] |
类型 | 用法 | 示例 | 备注 |
if | if condition then command fi |
if [ ${a} -eq ${b} ] then echo 'a is equals b'
fi |
|
while | while condition do command done |
count=10 while [ ${count} -gt 0 ] |
|
for | for var in arr do command done |
写法1: for name in "zhangsan" "lisi" "wangwu" 写法2: for((i=0;i<10;i++)) do echo "${i}" done |
|
case | case 值 in value) command;; esac |
case ${count} in 3) echo "you choose is 3";; 2) echo "you choose is 2";; 1) echo "you choose is 1";; 0) echo "you choose is 0";; esac |
注意每项匹配后面是跟的两个分号; 结尾字符是case倒过来写的 |
continue | 与Java完全一致 | ||
break | 与Java完全一致 |
有两种方式,两种方式没有任何区别:另外函数参数的传递不会写到括号里面,这点与Java差别很大;
function myFunction(){
echo "this function is being invoke"
}
myFunction(){
echo "this function is being invoke"
}
shell里面函数的参数是在调用函数的时候传递,函数里面通过${n}来获取从1开始的第n个参数
调用的格式:functionName param1 param2 param3 .....
举例:
function countScore(){
score=`expr ${1} + ${2}`
echo "score is ${score}"
}
countScore 99 77
使用return 提前退出;return后面可以不跟参数,如果跟了则代表函数返回值,需要注意的是,return只能返回数字
函数的返回值:
当函数返回数字的时候,只能返回0-255之间的值,超过则会重新充0开始计算,最终返回的是n%256;
如果显式的使用return的话,则函数返回return后面跟的内容;如果没有return,函数的返回值则是程序执行的最后一行代码的结果,两种方式都只能返回数字;
举例如下:
function countScore(){
`expr ${1} + ${2}`
}
countScore 99 77
echo "countScore return is $?"
以上方法都只能返回数字,如果想在函数中返回字符串的话,需要使用以下两种方式:
全局变量:
str=""
function getStr(){
str=""
}
getStr
echo "${str}"
把shell函数作为子程序调用,将其结果写到子程序的标准输出:
function getStr(){
echo ""
}
str=$(getStr)
echo ${str}
这里的写法跟函数那里非常类似,
传递参数:./train.sh hello world
使用参数:echo "${1} ${2}"
():
1
{}:
1
[]:
1
(()):
1
{{}}:
1