一、 编写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脚本执行完毕之后,也是可以查询的。
说白了,source主要是加载环境变量的。
2 ./ sh 以及 bashxxx.sh :他们是父进程会新开一个子进程,然后,这时候bash环境已经是一个新的bash环境,当子进程结束后,子进程内的变量或操作不会回传到父进程。而且sh就是bash:
[root@coolpay10 ~]# ls -al /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Dec 30 19:25 /usr/bin/sh -> 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?'unknownvariable'}
-bash: endeca: unknown variable
[root@localhost nicky]# echo ${endeca:?'unknownvariable'}
-bash: endeca: unknown variable
[root@localhost nicky]# endeca="Poweful SearchEngine Framework"
[root@localhost nicky]# echo ${endeca:?'unknownvariable'}
Poweful Search Engine Framework
root@localhost nicky]# echo ${endeca:='unknownvariable'}
Poweful Search Engine Framework
[root@localhost nicky]# echo ${endeca1:='unknownvariable'}
unknown variable
[root@localhost nicky]# echo ${endeca1:-'unknownvariable'}
unknown variable
[root@localhost nicky]# echo ${endeca2:-'unknownvariable'}
unknown variable
3.1.2 模式匹配运算符
变量运算符
${var#pattern}:
如果模式匹配变量的开始处,则删除匹配最短部分
echo ${var#/*}
结果为:opt/endeca/log/file.log
echo ${var#/opt}
结果为:/endeca/log/file.log
${var##pattern}:
如果模式匹配变量的开始处,则删除匹配最长部分
echo ${var##/opt}
结果为:/endeca/log/file.log
echo ${var##/*/}
结果为:file.log
${var%pattern}
如果模式匹配变量的结尾处,则删除匹配最短部分
echo ${var%*.log}
结果为:/opt/endeca/log/file
${var%%pattern}:如果模式匹配变量的结尾处,则删除匹配最长部分
${var/pattern/string}
${var//pattern/string}
1匹配模式最长的部分替换为string
2匹配模式所有匹配部分替换为string
echo -e ${path//:/'\n'}所有:替换成换行
3.2 变量类型
3.2.1用户变量
用户变量:在shell 脚本定义的变量,分为全局变量和本地变量
默认情况下,都是全局变量,除非显示声明类型是local的,才是局部变量。
语法:varname=value
注意:正确的赋值和变量替换方式
正确:[root@localhostnicky]# str="how are you"
正确:[root@localhostnicky]# str=hello
错误:[root@localhostnicky]# str=hello world
错误:[root@localhostnicky]# str = hello
错误:[root@localhostnicky]# str = "how are you"
报错:-bash: are:command not found
原因:赋值可以不加引号,但是只能是没有空格的字符;如果有空格必须,用双引号引起来;而且=两边不能有空格
删除变量:unset 变量名称
3.2.2 位置变量
位置变量即所谓的位置参数:
$0: 命令名称
$*: 所有的位置参数,不包括$0,因为$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 youinput 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 arehit 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 arehit 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]#