linux -shell

什么是shell
• Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux
的桥梁,用户的大部分工作都是通过Shell完成的。
• Shell既是一种命令语言,又是一种程序设计语言。 作为命令语言,
它交互式地解释和执行用户输入的命令;作为程序设计语言,它
定义了各种变量和参数,并提供了许多在高级语言中才具有的控
制结构,包括循环和分支。
Shell有两种执行命令的方式:
• 交互式( Interactive):解释执行用户的命令,用户输入一条命
令, Shell就解释执行一条。
• 批处理( Batch):用户事先写一个Shell脚本(Script),其中有很
多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲
命令。
常见的几种shell
• Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本。
• Unix/Linux上常见的Shell脚本解释器有bash、 sh、 csh、 ksh等,习惯上把它们称作
一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。
bash
• bash是Linux标准默认的shell, bash由Brian Fox和Chet Ramey共同完成,是
BourneAgain Shell的缩写,内部命令一共有40个。
sh
• sh 由Steve Bourne开发,是Bourne Shell的缩写, sh 是Unix 标准默认的shell。
csh
• csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共
有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说, csh
其实就是tcsh
ksh
ash等等
• 注意: bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于
Bourne shell,吸收了C shell和Korn shell的一些特性。 bash完全兼容sh,也就是
说,用sh写的脚本可以不加修改的在bash中执行。
第一个shell脚本
• 新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本的执行,
见名只意就好。
• vi test.sh
• #!/bin/bash
• echo “hello world”
• #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一
种Shell, echo命令用于向窗口输出文本。
• 运行shell的两种方法
• 作为可执行程序运行
• chmod +x test.sh #加上可执行权限
• ./test.sh
• 通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到
正确的解释器。
• 作为解释器的参数运行
• bash test.sh
Shell变量
• Shell 支持自定义变量
• 定义变量时,变量名不加美元符号( $)
name='besttest'
• 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有
编程语言都不一样,同时还得遵循以下规则:
• 首个字符必须为字母( a-z, A-Z)。
• 中间不能有空格,可以使用下划线( _)。
• 不能使用标点符号。
• 不能使用bash里的关键字(可用help命令查看保留关键字) 。
• 使用变量,使用变量时前面加上一个美元符号($)或者${name},
即可
• echo ${name}
Shell特殊变量
• Shell有很多特殊的变量,它们在shell中也有特殊的含义
变量 含义
$$ 当前Shell进程ID,就是这个脚本的pid
$0 当前文件名
$n 取传递给脚本的参数, n是一个数字, n是几就
取第几个参数
$# 取参数的个数
$@ 取所有参数, 被双引号(" ")包含时,与 $* 稍有
不同
$* 取所有参数
$? 最后命令的退出状态, 0表示没有错误,其他
任何值表明有错误
Shell算数运算
• + - * / % 分别对应加、减、乘、除、取余
• 只需将特定的算术表达式用“ $((” 和“ ))” 括起来,例如:
a=$((4-2)) a的值为2
a=10
b=2
echo $(($a+$b))
echo $(($a-$b))
echo $(($a*$b))
echo $(($a/$b))
echo $(($a%$b))
Shell关系运算符
运算

说明 举例
-eq 检测两个数是否相等,
相等返回 true。
[ $a -eq $b ]
-ne 检测两个数是否相等,
不相等返回 true。
[ $a -ne $b ]
-gt 检测左边的数是否大
于右边的,如果是,
则返回 true。
[ $a -gt $b ]
-lt 检测左边的数是否小
于右边的,如果是,
则返回 true。
[ $a -lt $b ]
-ge 检测左边的数是否大
等于右边的,如果是,
则返回 true。
[ $a -ge $b ]
-le 检测左边的数是否小
于等于右边的,如果
是,则返回 true。
[ $a -le $b ]
关系运算符列表
Shell关系运算符
布尔运算符列表
算符 说明 举例
!
非运算,表达式为
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
Shell关系运算符
字符串运算符列表
运算符 说明 举例
==
检测两个字符串是否相
等,相等返回 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。
Shell关系运算符
文件测试运算符列表
操作符 说明 举例 -d file 检测文件是否是目录,如果是,则返
回 true。 [ -d $file ] 返回 false。 -f file
检测文件是否是普通文件(既不是目
录,也不是设备文件),如果是,则
返回 true。 [ -f $file ] 返回 true。 -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。
Shell注释和单引号双引号
• 注释:
• 以“ #”开头的行就是注释,会被解释器忽略
• Shell中没有多行注释, 只能每一行加一个#号
• 单引号
• 单引号字符串的限制:
• 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效
的;
• 单引号字串中不能出现单引号
• 双引号
• 单引号字串中不能出现单引号
• 双引号里可以出现转义字符
Shell字符串操作
• 定义字符串
• 字符串定义可以用单引号,也可以用双引号,也可以不用引号
• a=„besttest‟ b=“besttest” c=besttest
• 拼接字符串
• 把一个字符串跟到另一个字符串后面即可,例如:
• name=“besttester"
• say="hello, "$name" !“
• say1="hello, ${name} !"
• say2 = hello,${name}!
• echo $say $say1 $say2
• 获取字符串长度
• #来获取字符串的长度
• str = „besttest‟
• echo ${#str}
• 获取字符串的某个元素
• str = „besttest is a good school‟
• echo ${s:1:4}
Shell数组操作
• 定义数组
• 在Shell中,用括号来表示数组,数组元素用“空格” 符号分隔开,不像其他语言中用
逗号分隔, shell中只支持一维数组,数组的下标可以不连续。
• 例如:
• array = (value1 value2 … )
• array = (value
value1
value2)
• 也可以通过下标赋值的方式来定义一个数组
• list[0]=1
• list[8]=9
• 数组的取值方式:
• ${array_name[index]}
• ${list[0]}
• 使用@ 或 * 可以获取数组中的所有元素, 例如
• ${list[*]}
• ${list[@]}
• 获取数组长度的方法与获取字符串长度的方法相同,使用#,例如:
• len = ${#list[*]}
Shell的if判断 • if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。 Shell 有三种 if ... else 语句: • if ... fi 语句; • if ... else ... fi 语句; • if ... elif ... else ... fi 语句。 • if ... else 语句的语法: • if [ expression ] then Statement(s) else Statement(s) fi
• if ... elif…else…fi 语句的语法: • if [ expression ] then Statement(s) elif [expression ] then Statement(s) else Statement(s) fi
if判断实例
• 用if来写一个简单的小脚本
• 判断一个脚本是否有执行权限,如果没有的话,给它加上可以执行的
权限,如果没有这个脚本的话,创建一个
• #!/bin/bash
file='/root/my.sh'
if [ -x $file ]
then
chmod +x $file
else
touch $file
chmod +x $file
fi
Shell的case esac判断
• case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。
• case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。 case语句格
式如下: case 值 in
模式1) command ;;
模式2) command ;; *) Command ;; esac
• case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。
取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直
至 ;;。 ;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
• 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再
继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
case esac判断实例
• 用case esac来写一个简单的小脚本
• 根据输入的参数来判断,输入r的话执行一个脚本,输入c的话创建一
个脚本,输入d的话删除这个脚本,输入其他的都执行这个脚本
• #!/bin/bash
num=$1
case $num in
x)
chmod +x my.sh
;;
d)
rm -rf my.sh
;;
c)
touch my.sh
;;
*)
bash my.sh
;;
esac
Shell的for循环
• for循环一般格式为:
for 变量 in 列表
do
command1
command2
...
commandN
done
for循环实战
• 做一个小练习,用for和if,遍历/root目录下的所有文件,打印出来可执行
的文件
#!/bin/bash
path='/root'
for file in $path/*
do
if [ -x $file -a -f $file ]
then
echo $file
fi
done
Shell的while循环
• while循环用于不断执行一系列命令,也用于从输入文件中读取数
据;命令通常为测试条件。其格式为:
while 条件
do
command
done
• 例如:
a=1
while [ $a -lt 5 ]
do
echo $a
a=$(($a+1))
done
while循环实战
• 做一个小练习,用while写一个计算累加和的脚本,输入一个数字,算它的
累加和。
#!/bin/bash
num=$1
i=0
sum=0
while [ $i -le $num ]
do
sum=$(($sum+$i))
i=$(($i+1))
done
echo "$sum"
Shell中的函数
• 在shell脚本中可以定义并使用函数
• 其定义格式为:
function 函数名( )
{
命令表
return xx
}
• 函数应先定义,后使用
• 调用函数时,直接利用函数名,如showfile,不必带圆括号
• shell脚本与函数间的参数传递可利用位置参数和变量直接传递
• 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利
用return命令

原文地址:https://www.cnblogs.com/lingxia/p/5889058.html