转载自https://blog.csdn.net/Haloby/article/details/8073740
本片文章将通过8个方面来讲解shell,在编写脚本的时候也可以把他当成是中文文档来查找。这八个方面分别是:1,解释器和执行shell 2,变量 3,参数传递 4,运算符 5,常见命令(echo printf test expr等) 6,流程控制与语法 7,函数 8,文件包含。每一个部分我都会用表格的形式来总结出必要的知识点以便查阅。
一 解释器与执行shell | |
| 用法和说明 |
解释器 | #!bin/sh Bourne shell版本 #!bin/bash Bourne Again Shell 版本 |
执行shell | chomd +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 “./”表示当前目录下 |
二 变量 | ||||
1、基本操作 | 操作 | 用法 | 举例 | 说明 |
1 定义 | 变量名 = 变量值 | variable_name=”abc” | 无需说明数据类型,如果是数字直接写数字1,1.1等等,如果是字符串用双引号或单引号括起来,如果是数组就用()扩起来。不能用数组开头,不能有空格和标点符号,不能使用关键字。 | |
2 使用 | $ variable_name 或${ variable_name } | $ variable_name ${ variable_name } | 大括号可以帮助解释器识别边界 | |
3 只读 | readonly variable_name | readonly variable_name | readonly 关键字,使用后无法修改 | |
4 删除 | unset variable_name | unset variable_name | Unset关键字,使用后变量不能再被引用 | |
2、字符串 | 1 拼接字符串 | 直接按照变量引用方式引用,不需要加“+”号 | a = “name” b = “hello ${a}!” | 必须使用{}用来识别边界 |
2 获取字符串长度 | “#”可以直接获取长度 | a = “abcd” echo ${#a} | #符号是shell中用来判断长度的符号,后面你会发先所有和长度有关的都用“#”来判断 | |
3 查找子字符串 | Index用来查找子字符串,返回子字符串开始的位置。 | string = “hello world !” Echo ` expr index “$string” world ` | “`”是反引号,不是单引号,在tab键上边,expr 关键字是说明将后边的内容当作表达式执行。 | |
3、数组 | 1 定义 | 用“()”括起来,元素之间用空格隔开 | array = (val0 val1 val2 … ) | 数组中的元素可以是多种类型,数字,字符串,变量。都可以 |
2 引用 | 还是用$来引用 | 引用某一个元素 ${array[n]} | n是元素的位置,从0开始 | |
3 获取所有元素 | 遍历所有元素用@符号 | ${array@]} | @符号用来遍历所有元素,shell中许多遍历所有内容,都会用@符号 | |
4 获取数组长度 | 长度获取用# | length = ${#array[@]} length = ${#array[*]} | *符号和@用法相似也可以用来表示所有。 | |
| 5 获取单个元素长度 | 长度获取用# | length = ${#array[n]}
| n表示元素位置,从0开始 |
三 参数传递 | ||||
| 操作 | 用法 | 举例 | 说明 |
1、基本用法 | 参数传递 | Shell可以不需要形参直接传递参数,参数之间用空格隔开 | $ chmod +x text.sh $ ./text.sh para1 para2 para3 | 参数之间用空格隔开,没有限制想传多少参数传多少 |
1 参数获取 | $ + 数字 | Para1 = $ 0 获取第一个参数 | $+数字直接获取对应位置的参数 | |
2 参数个数获取 | $ # | $ # | 获取传递到脚本的参数个数 | |
3 遍历参数 | $ * $ @ | $ *或$ @ | 将所有参数以一个字符串显示出来 | |
4 获取当前运行脚本ID | $ $ | $ $ | 获取当前运行脚本ID | |
5 获取后台最后运行脚本的ID | $ ! |
| 获取后台最后运行脚本的ID | |
6 显示选项 | $ - | $ - | 显示shell使用的当前选项,与set命令相同 | |
7 显示推出状态 | $ ? | $ ? | 显示最后命令的退出状态,0表示没有错误,其他表示有错误 |
四 运算符 | ||||
| 操作 | 用法 | 举例 | 说明 |
1、expr | 表达式计算工具 | 必须用“·”反引号括起来 | val=`expr 2+2` | expr 说明后面的表达式可以用运算符计算结果。 |
2、基本运算符 | + - * / % = == != | 与expr一起使用 | val=`expr 2+2` | = 赋值 == 等于 |
3、关系运算符 | 1 是否相等 | -eq | [ $a -eq $b ] 返回 false | 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 |
2 是否不等 | -ne | [ $a -ne $b ] 返回 true | ||
3 是否大于 | -gt | [ $a -gt $b ] 返回 false | ||
4 是否小于 | -lt | [ $a -lt $b ] 返回 true | ||
5 是否大于等于 | -ge | [ $a -ge $b ] 返回 false | ||
6 是否小于等于 | -le | [ $a -le $b ] 返回 true | ||
4、布尔运算符 | 1 非 | ! | [ ! false ] 返回 true | 表达式通常写在 [ ] 中括号内。 |
2 或 | -o | [ $a -lt 20 -o $b -gt 100 ] 返回 true | ||
3 与 | -a | [ $a -lt 20 -a $b -gt 100 ] 返回 false | ||
5、逻辑运算符 | 1 与 | && | [[ $a -lt 100 && $b -gt 100 ]] 返回 false | 逻辑运算符表达式通常在 [[ ]] 双中括号内。 |
2 或 | || | [[ $a -lt 100 || $b -gt 100 ]] 返回 true | ||
6、字符串运算符 | 1 相等 | = | [ $a = $b ] 返回 false | 假定变量 a 为 "abc",变量 b 为 "efg" |
2 不等 | != | [ $a != $b ] 返回 true | ||
3 长度是否为0 | -z | [ -z $a ] 返回 false | ||
4 长度是否不为 0 | -n | [ -n "$a" ] 返回 true | ||
5 是否为空 | string直接引用 | [ $a ] 返回 true | ||
7、文件测试运算符 | 1是否是块设备文件 | -b file | [ -b $file ] 返回 false | file="/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限 |
2是否是字符设备文件 | -c file | [ -c $file ] 返回 false | ||
3是否是目录 | -d file | [ -d $file ] 返回 false | ||
4是否是普通文件(既不是目录,也不是设备文件) | -f file | [ -f $file ] 返回 true | ||
5是否设置了 SGID 位 | -g file | [ -g $file ] 返回 false | ||
6是否设置了粘着位(Sticky Bit) | -k file | [ -k $file ] 返回 false | ||
7是否是有名管道 | -p file | [ -p $file ] 返回 false | ||
8是否设置了SUID位 | -u file | [ -u $file ] 返回 false | ||
9 是否可读 | -r file | [ -r $file ] 返回 true | ||
10是否可写 | -w file | [ -w $file ] 返回 true | ||
11是否可执行 | -x file | [ -x $file ] 返回 true | ||
12是否为空(文件大小是否大于0) | -s file | [ -s $file ] 返回 true | ||
13文件(包括目录)是否存在 | -e file | [ -e $file ] 返回 true |
五 常见命令(echo printf test expr) | ||||
| 操作 | 用法 | 举例 | 说明 |
1、echo | 用来显示字符串 | echo
| -e 开启转义 echo -e “ok! \n” \n 表示换行 Echo -e “ok! \c” \c 表示不换行 | 用于一般的字符串输出 |
2 printf | 用来打印输出 | printf | printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 | “-”表示左对齐,没有表示右对齐,10表示字符宽度,s表示显示字符串,4.2f表示4位float数字保留两位小数。 |
3 test | 检查某个条件是否成立 | test | If test -e ./bush then echo “文件存在” else echo “文件不存在” fi | Test和“[ ]”用法相似 |
4 expr | 表达式计算工具 | expr `表达式` | a = expr `2+2` | expr 说明后面的表达式可以用运算符计算结果。 |
六 流程控制和语法 | ||||
| 操作 | 用法 | 举例 | 说明 |
1 If | If语句 | If condition Then command1 fi | 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 | Shell的流程控制通常会有结束语句,一般为倒写关键字 |
If else语句 | If condition Then command1 else command2 fi | |||
If elif else | if condition1 then command1 elif condition2 then command2 else commandN fi | |||
2 for | for in do done | for var in item1 item2 ... itemN do command1 command2 ... commandN done | for loop in 1 2 3 4 5 do echo "The value is: $loop" done | 关键字in代表循环条件,同样也有结束语句关键字done |
3 while | while do down | while condition do command done | int=1 while(( $int<=5 )) do echo $int let "int++" done | While 后面条件为空 while : 或者条件为true时 while true |
4 until | until do done | until condition do command done | a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done | until 也是循环控制语句,不过条件返回为true时才停止循环 |
5 case | case in 模式1) 模式2) esac | case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN; esac | echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' 2) echo '你选择了 2' 3) echo '你选择了 3' 4) echo '你选择了 4' *) echo '你没有输入 1 到 4 之间的数字'; esac | 取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 |
6 break | 跳出所有循环,终止后面所有的操作。 | break | while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!"; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done | break,从这里开始中止后边所有的循环操作。 |
7 continue | 跳出本次循环,进入下一个循环条件 | continue | while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done | continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环 |
七 函数 | ||||
1 函数 | [function] funname [()] { action; [return int;] }
“[ ]”方括号中的是可选选项,可以写也可以不写。如果不加return 函数还是会返回最后一条的命令结果的。 | [function] funname [()] { action; [return int;] | demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----" | 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255 |
八 文件包含 | ||||
1 文件包含 | . filename
# 注意点号(.)和文件名中间有一空格 或
source filename | . filename
source filename | #使用 . 号来引用test1.sh 文件 . ./test1.sh
# 或者使用以下包含文件代码 # source ./test1.sh | 和java引入类,python导入模块差不多。Shell也可以引入文件直接使用被引入文件中的变量和函数。 |