Shell编程
让.sh可执行
修改文件属性
chmod a+x xxx.sh
添加注释
在.sh脚本脚本中添加如下注释
#!/usr/bash
使用变量
变量分类
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量命名
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
定义变量
#定义字符串(注意等号之间不可以有空格)
var="this is a string!"
#定义数字
var=100
#定义只读变量
readonly var
使用变量
#无括号
echo $var
#有括号
echo ${var}
#删除变量
unset var
字符串
定义字符串
a='a'
#单引号定义字符串
str='this is a ${a}'
##结果为this is a ${a},单引号内的任何字符串都会原样输出
#双引号定义字符串
str="this is a ${a}"
##结果为this is a a,双引号里边可以出现转义字符,并可以有变量
字符串的相关操作
#拼接字符串
str1="hello"
str2="world"
str="${str1} ${str2}"
#获取字符串长度
echo ${#str}
#提取子字符串
echo ${str:1:4}
Shell数组
定义数组
array=(1 2 3 4 5)
arraystr=("a" "b" "c" "d")
#可以单独定义数组的值
array[0]=value0
...
array[n]=valuen
使用字符串
#使用数组元素的一般格式是:
${array[n]}
#获取数组所有元素
${array[@]}
#获取数组长度
length=${array[@]}
运算符
算术运算符
shell本身不支持算术运算符,需要使用expr
进行算术运算
或者使用let
逻辑运算符
注意逻辑运算符的格式如下 :
[ a op b ]
#注意中间的空格
#如果为真返回0,如果为假返回1
关系运算符
运算符 | 说明 |
---|---|
-eq | == |
-ne | != |
-gt | > |
-lt | < |
-ge |
= |
-le | <= |
逻辑运算符
- &&
- ll
字符串运算符
运算符 | 说明 |
---|---|
= | 判断是否相等 |
!= | 是否不等 |
-z | 是否长度为0 |
-n | 是否有内容 |
str | 等同于-n |
文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是具名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
输入输出
输出
echo
echo something
printf
#same as `printf` in C
printf "%d" 100
输入
read
read var
流程控制
分支结构
if [ condition ]
then
command
elif
then
command
else
command
fi
case var in
value-1)
command;;
value-1)
command;;
*)
command;;
esac
循环结构
for var in item1 item2
do
command
done
while condition(true/:)
do
command
done
函数
定义函数
[function] fun [()]
{
command
[return value;]
}
使用函数
- 函数相当于一条语句
- 用$?获取函数返回结果
- 在函数中用 1, 2获取参数
文件包含
#包含文件
. filename