一、 编写shell的格式
1 第一行决定使用哪一种shell
Bash:#! /bin/bash
Python:#! /usr/bin/python
不知道解释器的完整路径,可使用whereis 解释器名称(bash)
2 # …… 表示注释
3 正常的程序体
二、 source . bash sh ./ 执行脚本有啥区别
1 source xxx.sh 等价于 . xxx.sh: 他们是在父进程中执行的,因此各项操作都会在原本的bash环境下生效。所以通过这两种执行的shell 脚本内的变量,在shell脚本执行完毕之后,也是可以查询的。
2 ./ sh 以及 bashxxx.sh :他们是父进程会新开一个子进程,然后,这时候bash环境已经是一个新的bash环境,当子进程结束后,子进程内的变量或操作不会回传到父进程
三、 变量和引用
3.1变量运算符
3.1.1 替换运算符
${var:-word} | var存在且非空,返回var值,否则返回word |
${var:+word} | 对已赋值的var,重设其值 |
${var:=word} | var存在且非空,返回var值,否则将var的值赋值为word,然后返回这个值 |
${var:?word} | 如果var存在切非空,返回var值,否则打印 word内容。 |
[root@localhost nicky]# echo ${endeca?'unknown variable'} -bash: endeca: unknown variable [root@localhost nicky]# echo ${endeca:?'unknown variable'} -bash: endeca: unknown variable [root@localhost nicky]# endeca="Poweful Search Engine Framework" [root@localhost nicky]# echo ${endeca:?'unknown variable'} Poweful Search Engine Framework root@localhost nicky]# echo ${endeca:='unknown variable'} Poweful Search Engine Framework [root@localhost nicky]# echo ${endeca1:='unknown variable'} unknown variable [root@localhost nicky]# echo ${endeca1:-'unknown variable'} unknown variable [root@localhost nicky]# echo ${endeca2:-'unknown variable'} unknown variable |
3.1.2 模式匹配运算符
变量运算符 | 说明 |
${var#pattern} | 如果模式匹配变量的开始处,则删除匹配最短部分 [root@localhost nicky]# echo ${var#/*} opt/endeca/log/file.log [root@localhost nicky]# echo ${var#/opt} /endeca/log/file.log |
${var##pattern} | 如果模式匹配变量的开始处,则删除匹配最长部分 [root@localhost nicky]# echo ${var##/opt} /endeca/log/file.log [root@localhost nicky]# echo ${var##/*/} file.log |
${var%pattern} | 如果模式匹配变量的结尾处,则删除匹配最短部分 [root@localhost nicky]# echo ${var%*.log} /opt/endeca/log/file |
${var%%pattern} | 如果模式匹配变量的结尾处,则删除匹配最长部分 |
${var/pattern/string} ${var//pattern/string} | 1匹配模式最长的部分替换为string 2匹配模式所有匹配部分替换为string [root@localhost nicky]# echo -e ${path//:/'\n'}所有:替换成换行 |
3.2变量类型
3.2.1用户变量
用户变量:在shell 脚本定义的变量,分为全局变量和本地变量
默认情况下,都是全局变量,除非显示声明类型是local的,才是局部变量。
语法:varname=value
注意:正确的赋值和变量替换方式
正确:[root@localhost nicky]# str="how are you" 正确:[root@localhost nicky]# str=hello 错误:[root@localhost nicky]# str=hello world 错误:[root@localhost nicky]# str = hello 错误:[root@localhost nicky]# str = "how are you" 报错:-bash: are: command not found |
原因:赋值可以不加引号,但是只能是没有空格的字符;如果有空格必须,用双引号引起来;而且=两边不能有空格
删除变量:unset 变量名称
3.2.2位置变量
位置变量即所谓的位置参数:
$0:命令名称
$*:所有的位置参数,不包括$0
$#:未知参数的个数
3.2.3环境变量
环境变量的值适用于所有由登录进程所产生的子进程,定义环境变量的基本格式:
ENVRION-VARIABLE=VALUE #赋值
Export ENVRION-VARIABLE #声明环境变量
四、 测试 退出 判断 操作符
4.1 测试
语法格式:test expression
4.1.1整数比较运算符:
-eq: 等于
-ge: 大于或者等于
-le: 小于或者等于
-gt: 大于
-lt: 小于
-ne: 不等于
4.1.2 字符串比较运算符:
String: string 是否不为空
-n string: string 是否不为空
-z string: string 是否为空
Str1=Str2: str1 是否等于str2
Str1!=Str2: str1 是否不等于str2
4.1.3 文件操作符:
-e file: 文件是否存在
-d file: 文件是否为目录
-f file: 文件是否为普通文件
-r: 文件是否可读
-w: 文件是否可写
-x: 文件是否可操作
-h|-L: 文件是否是连接文件
-s: 该文件是否存在,且为非空白文件
-S: 是否为Socket文件
-nt: 前面的文件是否比后面的文件新
-ot: 前面的文件是否比后面的文件旧
4.1.4 逻辑运算符:
!exp: 是否为false
-a: 表示且
-o: 表示或
4.2 判断
4.2.1 if 判断
if(exp1) then statement…… elif(exp2) then statement…… else statement…… fi |
4.2.2 exit
语法:exit status
Status:0-255 之间的数字表示,一般返回该状态的值的同时伴随着脚本的退出,参数被保存到shell变量$?中。
#! /bin/bash echo -e "input a string:" read str1 if [ -z "$str1" ] # ; then then echo "what you input is null!"; exit 1; fi |
4.2.3 case
case variable in var1) ……command…… ;; var2) ……command…… ;; *) ……command…… ;; esac |
五、循环与结构化变量
5.1 for循环
5.1.1 列表for循环
for variable in {list} do statements...... done |
5.1.1 不带列表for循环,由用户指定参数和参数个数
for variable do statements...... done |
5.1.1 c类for循环
for ((exp1; exp2; exp3)) do statements...... done |
5.2 while 循环
5.2.1 计数器控制的while循环
int x=5; while (("$int" <= 5)) do echo "$int" let "$int++" done |
5.2.1 结束标记控制的while循环
echo "please input the num[1-10]:" read num while[[ "$num" != 4 ]] do if [ "$num" -lt 4 ]; then echo "Too Small, Try Again" read num elif [ "$num" -gt 4 ]; then echo "Too High, Try Again" read num else exit 0 fi echo "You are hit the results!" done |
5.2.1 标志控制的while循环
echo "please input the num[1-10]:" read num signal=0 while[[ "signal" != 1 ]] do if [ "$num" -lt 4 ]; then echo "Too Small, Try Again" read num elif [ "$num" -gt 4 ]; then echo "Too High, Try Again" read num else signal=1 exit 0 fi echo "You are hit the results!" done |
5.2.1 命令行控制的while循环
5.3.until循环,直到满足什么才做某事
i=0 until [[ "$i" -gt 10 ]] do let "s=i*i" echo "$i * $i = $s" let "i++" done |
5.4 select 结构
[root@localhost nicky]# cat > 04.sh << "end" > #! /bin/bash > echo "what is you like color?" > select color in "red" "blue" "black" "green" "orange" "others" > do > break > done > echo -e "you have selected $color" > end [root@localhost nicky]# chmod 777 04.sh [root@localhost nicky]# ./04.sh what is you like color? 1) red 2) blue 3) black 4) green 5) orange 6) others #? 3 you have selected black [root@localhost nicky]# |