shell基础语法
2016-01-15 18:49
429 查看
一、shell约定
shell脚本文件扩展名为.sh
第一行:#!/bin/bash #! 表示该脚本所使用的解释器
chmod +w bash文件名 将该bash修改为可执行
执行bash方法: ./t.sh
注意:在执行脚本时可能会出现:
-bash: ./shell.sh: /bin/bash^M: bad interpreter: No such file or directory的错误
解决办法:执行sed -i "s/\r//" filename(脚本文件名) 然后在执行脚本
二、变量
1. shell脚本没有数据类型,在定义变量时,无需使用关键字声明,直接给出变量名:v1="tom" //注意变量赋值使用双引号
定义变量名要遵循一下规则:
1)变量名的首字符必须为字母
2)不可包含标点
3)不可为关键字
4)中间可包含_
2. 只读变量:使用readonly修饰,只读变量不可修改 ;用法: readyonly name="zhangsan"
或者 在定义变量之后修饰:name="zhangsan" readyonly name
3. 删除变量:使用关键字unset 变量名 例如:unset name 删除该变量之后,该变量的值为空
4. 变量的使用:${变量名} 或 $变量名 例如:echo "my name is ${name}" 这个时候一定要加上{}
5. 特殊变量:具有特定含义的变量,例如:$$ 表示当前shell的pid
经常使用的特殊变量有:
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
其中$*与$@都表所有的参数,但是当参数使用双引号时,例如("zhangsan" "lisi") $@表示的参数以空格隔开,而$*没有
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,
大部分命令执行成功会返回 0,失败返回 1。不过,也有一些命令返回其他值,表示不同类型的错误。
三、 转义字符:/n /t /f /r 在使用转义字符的时候,要使用-e 说明
例如:a=10
echo -e "the num a is ${a} \n"
得到的结果是the num a is 10 (后面有一个空行) 不加-e 则输出the num a is 10 \n
四、命令替换:指将命令执行的结果保存起来,在适当的时候输出
使用方法:`command` (注意此处的``是esc键下的)
例如:Date=`data`
echo $Date
五、变量替换:根据变量的状态(是否为空或者unset)来改变它的值
${var:-word} 如果var为空或者被unset,则返回word(此处的word并不是变量,而是一个值),不改变var的值
${var:=word} 如果var为空或者被unset,则返回word,并且将word赋给var
${var:?messgae} 如果var为空或者被unset,则直接message输出 并且停止运行
${var:+word} 如果var不为空或者没有被unset 则返回word,不改变var的值
例如:
#!/bin/bash
num1=10
num2=12
unset num1
message="error num1 is null or unseted"
i=${num1:-num2} #num2 此时num1仍然处于被删除状态
echo $i
i=${num1:=num2} #num2 此时num1的值变为num2
echo $i
i=${num1:+message} #message 此时num1的值为num2
echo $i
unset num1
i=${num1:?message} #message 此时抛出message 并且不执行后面的echo
echo $i
六、运算符
1. 算数运算符
a=20 b=10
+ 加法
`expr $a + $b` 结果为 30。
- 减法
`expr $a - $b` 结果为 10。
* 乘法
`expr $a \* $b` 结果为 200。
/ 除法
`expr $b / $a` 结果为 2。
% 取余
`expr $b % $a` 结果为 0。
= 赋值
a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。
[ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。
注意:表达式和运算符之间要有空格
·expr $a == $b· 结果是0
·expr $a != $b· 结果是1
不可使用i=[ $a == $b ] 进行赋值,通常用于if中
2. 关系运算符(只支持数字或数字字符串)
-eq
检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
注意:[ 与 $a 之间要有空格
3. 布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
4. 字符串运算符
= 检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。
[ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
5. 文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
-b file
检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $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。
七、注释:sh里没有多行注释,只能每一行加一个#号。
八、字符串:即可用单引号,也可用双引号(最好使用双引号)
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行,内部使用单引号无效)
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
1,字符串拼接 语法:"str1"$str2"" 或 ""$str1""str2"",即内部嵌套
2,字符串的长度 语法:${#str},例如 str="abc" echo ${#str} 得到3
3,提取字符串 语法:${str:begin:length}/${str:begin} 例如:str="abcd" echo ${str:1:2} 得到bc
4,查找字符串 语法: ·express index "$str" s· 例如:str="my name is tom" echo `expr index "$str" tom`
九、数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始编号。获取数组中的元素要利用下标,
下标可以是整数或算术表达式,其值应大于或等于0。
用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value1 ... valuen)
或array_name[0]=value1 array_name
=valuen 单独定义
读取数组:${array_name
} //n表示下标,从0开始、可以是变量、表达式
数组大小:${#array_name[*]} 或 ${#array_name[@]}
输出数组所有元素:${array_name[*]} 或 ${array_name[@]}
十、控制结构
1.if选择
if[] then fi
if[] then else fi
if[] then elsif else fi
2.for循环
for var in 列表(用空格隔开,注意不能是一个数组变量)
do
done
3.while循环
while []
do
done
4.until []
do
done
注意:while与unitl的判断正好相反,while为true时继续执行,而until为true则退出
5.case var in conditions) command ;; esac
例如:
case $num in
1)
echo "you print 1"
;;
2)
echo "you print 2"
;;
*)
echo "you num ..."
;;
esac
break、continue:break是终止循环,continue是直接执行下此次循环,跳过continue后的
十一、函数
Shell 函数必须先定义后使用。函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如
一个字符串,往往会得到错误提示:“numeric argument required”。如果一定要让函数返回字符串,那么可以先定义一个变量,
用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
函数的调用:函数名称即可,如果有参数,直接在函数名后面用空格隔开(调用不需要())
str="abc"
function hello()
{
echo $str
str="def"
echo "hello"
return 22 //如果有返回值,则使用return ,那么$? 的结果return后的结果 ,如果没有返回值$?为0或其他数字
}
hello
echo $?
echo $str
得到的结果:abc
hello
22
def
----------------------------------------
function hi()
{
echo "hi $*"
}
hi "tom" "jack"
得到的结果:hi tom jack
$*:所有参数 $n:第n个参数 $#:参数的个数
删除函数:unset 函数名 例如:unset hi
unset -v 变量名 unset -f 函数名
unset 函数名或变量名
十二、shell文件包含:一个shell文件可以包含另一个shell文件,使用source 文件名 或. ./文件名,其中函数名和变量可以共享
shell.sh
#!/bin/bash
function hi()
{
` cd /home/hollysp/22 `
` touch t4.sh `
}
t1.sh
#!/bin/bash
source shell.sh #. ./shell.sh 注意第一个点和第二个点之间要有空格
hi
调用./t1.sh 查看文件创建成功
shell脚本文件扩展名为.sh
第一行:#!/bin/bash #! 表示该脚本所使用的解释器
chmod +w bash文件名 将该bash修改为可执行
执行bash方法: ./t.sh
注意:在执行脚本时可能会出现:
-bash: ./shell.sh: /bin/bash^M: bad interpreter: No such file or directory的错误
解决办法:执行sed -i "s/\r//" filename(脚本文件名) 然后在执行脚本
二、变量
1. shell脚本没有数据类型,在定义变量时,无需使用关键字声明,直接给出变量名:v1="tom" //注意变量赋值使用双引号
定义变量名要遵循一下规则:
1)变量名的首字符必须为字母
2)不可包含标点
3)不可为关键字
4)中间可包含_
2. 只读变量:使用readonly修饰,只读变量不可修改 ;用法: readyonly name="zhangsan"
或者 在定义变量之后修饰:name="zhangsan" readyonly name
3. 删除变量:使用关键字unset 变量名 例如:unset name 删除该变量之后,该变量的值为空
4. 变量的使用:${变量名} 或 $变量名 例如:echo "my name is ${name}" 这个时候一定要加上{}
5. 特殊变量:具有特定含义的变量,例如:$$ 表示当前shell的pid
经常使用的特殊变量有:
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
其中$*与$@都表所有的参数,但是当参数使用双引号时,例如("zhangsan" "lisi") $@表示的参数以空格隔开,而$*没有
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,
大部分命令执行成功会返回 0,失败返回 1。不过,也有一些命令返回其他值,表示不同类型的错误。
三、 转义字符:/n /t /f /r 在使用转义字符的时候,要使用-e 说明
例如:a=10
echo -e "the num a is ${a} \n"
得到的结果是the num a is 10 (后面有一个空行) 不加-e 则输出the num a is 10 \n
四、命令替换:指将命令执行的结果保存起来,在适当的时候输出
使用方法:`command` (注意此处的``是esc键下的)
例如:Date=`data`
echo $Date
五、变量替换:根据变量的状态(是否为空或者unset)来改变它的值
${var:-word} 如果var为空或者被unset,则返回word(此处的word并不是变量,而是一个值),不改变var的值
${var:=word} 如果var为空或者被unset,则返回word,并且将word赋给var
${var:?messgae} 如果var为空或者被unset,则直接message输出 并且停止运行
${var:+word} 如果var不为空或者没有被unset 则返回word,不改变var的值
例如:
#!/bin/bash
num1=10
num2=12
unset num1
message="error num1 is null or unseted"
i=${num1:-num2} #num2 此时num1仍然处于被删除状态
echo $i
i=${num1:=num2} #num2 此时num1的值变为num2
echo $i
i=${num1:+message} #message 此时num1的值为num2
echo $i
unset num1
i=${num1:?message} #message 此时抛出message 并且不执行后面的echo
echo $i
六、运算符
1. 算数运算符
a=20 b=10
+ 加法
`expr $a + $b` 结果为 30。
- 减法
`expr $a - $b` 结果为 10。
* 乘法
`expr $a \* $b` 结果为 200。
/ 除法
`expr $b / $a` 结果为 2。
% 取余
`expr $b % $a` 结果为 0。
= 赋值
a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。
[ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。
注意:表达式和运算符之间要有空格
·expr $a == $b· 结果是0
·expr $a != $b· 结果是1
不可使用i=[ $a == $b ] 进行赋值,通常用于if中
2. 关系运算符(只支持数字或数字字符串)
-eq
检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
[ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
注意:[ 与 $a 之间要有空格
3. 布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
4. 字符串运算符
= 检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。
[ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
5. 文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
-b file
检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $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。
七、注释:sh里没有多行注释,只能每一行加一个#号。
八、字符串:即可用单引号,也可用双引号(最好使用双引号)
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行,内部使用单引号无效)
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
1,字符串拼接 语法:"str1"$str2"" 或 ""$str1""str2"",即内部嵌套
2,字符串的长度 语法:${#str},例如 str="abc" echo ${#str} 得到3
3,提取字符串 语法:${str:begin:length}/${str:begin} 例如:str="abcd" echo ${str:1:2} 得到bc
4,查找字符串 语法: ·express index "$str" s· 例如:str="my name is tom" echo `expr index "$str" tom`
九、数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始编号。获取数组中的元素要利用下标,
下标可以是整数或算术表达式,其值应大于或等于0。
用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value1 ... valuen)
或array_name[0]=value1 array_name
=valuen 单独定义
读取数组:${array_name
} //n表示下标,从0开始、可以是变量、表达式
数组大小:${#array_name[*]} 或 ${#array_name[@]}
输出数组所有元素:${array_name[*]} 或 ${array_name[@]}
十、控制结构
1.if选择
if[] then fi
if[] then else fi
if[] then elsif else fi
2.for循环
for var in 列表(用空格隔开,注意不能是一个数组变量)
do
done
3.while循环
while []
do
done
4.until []
do
done
注意:while与unitl的判断正好相反,while为true时继续执行,而until为true则退出
5.case var in conditions) command ;; esac
例如:
case $num in
1)
echo "you print 1"
;;
2)
echo "you print 2"
;;
*)
echo "you num ..."
;;
esac
break、continue:break是终止循环,continue是直接执行下此次循环,跳过continue后的
十一、函数
Shell 函数必须先定义后使用。函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如
一个字符串,往往会得到错误提示:“numeric argument required”。如果一定要让函数返回字符串,那么可以先定义一个变量,
用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
函数的调用:函数名称即可,如果有参数,直接在函数名后面用空格隔开(调用不需要())
str="abc"
function hello()
{
echo $str
str="def"
echo "hello"
return 22 //如果有返回值,则使用return ,那么$? 的结果return后的结果 ,如果没有返回值$?为0或其他数字
}
hello
echo $?
echo $str
得到的结果:abc
hello
22
def
----------------------------------------
function hi()
{
echo "hi $*"
}
hi "tom" "jack"
得到的结果:hi tom jack
$*:所有参数 $n:第n个参数 $#:参数的个数
删除函数:unset 函数名 例如:unset hi
unset -v 变量名 unset -f 函数名
unset 函数名或变量名
十二、shell文件包含:一个shell文件可以包含另一个shell文件,使用source 文件名 或. ./文件名,其中函数名和变量可以共享
shell.sh
#!/bin/bash
function hi()
{
` cd /home/hollysp/22 `
` touch t4.sh `
}
t1.sh
#!/bin/bash
source shell.sh #. ./shell.sh 注意第一个点和第二个点之间要有空格
hi
调用./t1.sh 查看文件创建成功
相关文章推荐
- .NET 用Process类启动Shell进程的报错分析
- Linux Bash算数运算方法小结
- linux系统shell语法简介-49
- linux实战(二)----shell脚本监控实例-----日志截取三个命令在性能监控等运用中的实例解析
- linux实战(二)----shell脚本监控实例-----日志截取三个命令在性能监控等运用中的实例解析
- shell--学习 sed
- shell 文件操作大全 193条命令
- 使用Python和shell脚本打包ipa
- 40 个很有用的 Mac OS X Shell 脚本和终端命令
- shell中使用php命令
- linux C中调用shell命令和运行shell脚本
- execlp启动android进程命令窗口通过adb shell 进入android 的Linux命令界面,输入am -help看到如下信息: 我们可以通过命令启动android中的
- 对Shell几个冷知识的总结(IFS,数组,替换,切割,查找)
- 通过java执行shell脚本
- Linux使用shell脚本调用sendmail发送带附件的邮件
- rsync上传文件bash脚本
- ADB Shell命令行
- The Scripting Wife Uses PowerShell to Get Hardware Information
- linux x86_64 缓冲区溢出分析 以及 shellcode简介
- java希尔排序--ShellSort