1)脚本解释器,解释执行脚本的程序bash
#!/bin/bash 需要bash来执行
2)是的脚本有执行属性
chmod +x hello.sh
1)variable="felxitao"
定义变量的等号两边不能够有等号。
2) for skill in apche nginx redis java c++;do
ehco i am good at ${skill}
done
3)变量的定义可以重复进行,后面的定义结果会覆盖之前的定义值。
1)局部变量
局部变量在脚本或命令中定义,仅在当前的shell 实例中有效,其他shell启动程序不能访问该局部变量。
2)环境变量
所有的程序,包括shell启动的脚本都可以访问环境变量,有些程序需要环境变量保证正常运行,必要时可以定义环境变量
3)shell变量
shell变量是由shell程序设定特殊变量。
$来使用变量,可用{}来包围变量
foo="foo"
bar=${foo}
可以用readonly来修饰变量
foo="abcde"
readonly foo
这样foo就变成了只读变量
变量的删除是可以把之前变量的定义抹除,在之后不可以使用。
foo="bar"
bar=${foo}
unset foo
这样后面就不可以使用foo变量。
shell字符串有单引号和双引号的区分。单引号表示原样输出内容,不对字符串内容进行转义,不可以使用单引号,也不可以在其中使用变量。
str1='this is a string with single quotation'
双引号表示可以对其中字符串转义,可以在其中使用变量。
str2="this is a string with double quotation"
1)获取字符串长度
str="abcde"
echo ${#str} 输出的是5
2)提取子字符串
str="12345678"
echo ${str:1:4} 输出的是2345
表示的是从字符串中第二个字符串开始截取4个字符。
echo ${str:1} 输出2345678
表示的是从第二个字符开始一直截取到尾部。
echo ${str:0-4:3}输出567
表示的是从倒数第4个字符开始截取3个字符
echo ${str:0-5}输出45678
表示从倒数第5个开始到结束
3)查找字符串
str="123456"
echo `expr index "${str}" is`
查找str中is的位置。
expr 是一个计算工具,还可以用来计算数值
4)截取字符串(#,%)
#表示从第一个匹配处截取到结尾,##表示从最后一个匹配处截取到尾部
%表示从第一个匹配处截取到头,%%表示从最后一个匹配处截取到头
str="http://10.12.73.112/data/operate?type=0001
${str#*//}
这里#表示从第一个匹配处开始截取到结尾,*//表示匹配规则,匹配//,正则表达式类似
${str##*/}
表示从最后一个匹配项开始截取到尾部
${str%/*}
表示从尾部开始第一个匹配处,截取到开头。
array=(1 2 3 A B C)
利用小括号包围变量,同时各个数组元素之间用空格隔开。
echo ${array[1]} 输出的是2
表示引用第二个变量。
echo ${array[*]}输出 1 2 3 A B C
表示输出所有的元素。
echo ${#array[*]}输出6
表示获取数组的元素个数。
算术运算需要用到expr命令
a=10
b=12
val=`expr $a + $b`
echo val输出22
运算符为以下
+ - * / % = == !=
注意:这些运算符和运算元之间得有空格隔开,另外*运算符需要用\*转义符
只是用来比较数值,运用于条件表达式中
a=10
b=12
if [ $a -eq $b ]
then
echo a equal b
fi
注意:这里的[ $a -eq $b ]表达式在[]两边留有空白,另外运算符和变量之间留有空白,
不是[$a-eq$b]。
-eq 相等关系
-ne 不相等
-lt 左边运算元小于右边运算元
-gt 左边运算元大于右边运算元
-le 左边小于等于右边
-ge 左边大于等于右边
! 非
-o or有一个表达式为真,即为真
-a and两个表达式都为真,才为真
[ $a -lt $b -o $a -gt $b -a $a -eq $b ]
只用来检查字符串的关系
str1=abced
str2=asdf
if [ $str1 != $str2 ]
then
echo true
fi
输出true
还支持一下运算符
= 检查字符串是否相等 [ $a = $b ]
!= 检查字符串不相等 [ $a != $b ]
-z 检查字符串长度是否为0,为0则返回true [ -z $a ]
-n 检查字符串长度是否为0,不为0则返回true
[ $a ] 字符串为空则返回false,不空返回true
[ -r $file ]文件可读,输出true
[ -w $file ]文件可执写,输出true
[ -x $file ]文件可执行,则输出true
[ -s $file ]文件是否为空,不空返回true
1)
if
then
...
fi
2)
if
then
...
elif
then
...
fi
str="abd afaf afaf"
1)for循环
for var in item1 item2 itemN
do
command
done
2)while 循环
while condition
do
command
done
注意:一般用循环也需要要用到循环计数,需要实现递增,可以用
let "index++"命令或者利用 declare -i index=0来定义一个数值变量。
case var in
var1)
command1
command2
...
command3
;;
var2)
command4
...
;;
esac
[ function ] funname[ () ] {
action1
action2
[return int;]
}
形如这样的定义。函数可以传递进入参数,调用是直接用函数名,后面可以跟参数,用空格隔开,这样就类似于脚本的参数一样。
举例:
1)定义
function fun() {
echo "第一个参数是${1}"
echo "第一个参数是$1"
...
echo "第n个参数是 ${n}"
return $((${1} + ${2}))
}
2)调用
fun 1 2 3 4 5 ...
3)获取调用结果
echo $?可以得到函数返回的结果。
>file重定向到文件,刷新文件内容
>>file向文件尾部追加内容