shell是什么
在计算机科学中,shell是一个命令解释器,我们知道我们是通过计算机的操作系统来控制硬件的,同样的,我们的应用程序也是通过计算机操作系统来控制底层的硬件,但是应用程序是不能直接操控操作系统,在应用程序和操作系统当中还有一个层级就是shell,shell是操作系统和应用程序之间的接口,shell先处理应用程序发送过来的信息,然后解释给操作系统,同时将操作系统的结果解释给应用程序,总的来说,shell就是在操作系统和应用程序之间的命令编译工具。
shell练习
不得不说一下,shell经过多年的发展,在linux上已经迭代了很多年,而我们现在使用的shell就是/bin/bash这个版本。
第一个脚本
首先创建一个以sh为后缀结束的的文件
touch a.sh
编辑这个文件
vim a.sh
在里面输入一条命令
#! bin/bash
echo "起飞"
差不多好了,为什么差不多呢?因为我们要的文件是一个可执行文件,而一般刚创建出来的文件权限只有可读和可写,没有可执行,所以我们要把这个权限加上去。
输入命令,把全部的权限开放
chmod 777 a.sh
再执行
./a.sh
好了,接下来会输出echo里面的语句
shell注释
单行注释
在语句前面增加#号
#起飞
多行注释
:<<!
起飞
!
或者
:<< 字符
注释的内容
字符
额,一般都用第一个,我感觉有些同学会在第二个上面搞些骚操作
:<< 字符
注释的内容
字符
shelll普通变量
方式一
变量名=变量值
要求:变量必须是一个整体,中间没有特殊字符
number=10
echo $number
方式二
变量名='变量值'
要求:单号中的内容,原样赋值
number='10'
echo $number
方式三
变量名="变量值"
要求:如果双引号里面有其他变量,会把变量结果进行拼接,然后赋值
number="10"
echo $number
一般来说数字是不加双引号的,其他的默认加双引号
顺便说一下等号要贴着写,不要留空格,这个差点看不出来哪错
命令变量
方式一
变量名=`命令` 注意这里是反引号,就是tab键上面那个键打出来的
d=`data`
echo $d
方式二
变量名=$(命令) 将执行后的结果赋值给变量
d=$(data)
echo $d
建议使用第二种方式
使用变量
方式一
$变量名 非标准写法
不介绍
方式二
$'变量名' 非标准写法
不介绍
方式三
${变量名} 加了一个大括号
不介绍
方式四
"${变量名}" 标准使用方式
d=$(data)
out="现在的时间为"${d}""
echo $out
只读变量
只读变量就是只能读,不能用的变量
d=$(data)
out="现在的时间为"${d}""
echo $out
unset out
echo "${out}"
运行一下就会发现这个变量不会输出
shell数组
定义数组
数组名=(值1 值2 ...值n)
arry=(1 2 3 4)
给数组的元素赋值
数组名[索引]=值
arry[0]=1
是不是感觉很熟悉啊
获取元素
${数组名[下标]}
${arry[0]}
获取长度
${#数组名[*]}
${#arry[*]}
${#数组名[@]}
${#arry[@]}
获取数组长度的语法和获取索引的语法差不多,只不过多了一个#号,这个符号应该是统计的意思
如果在里面的索引填0的话会返回1
${#arry[0]}
算术运算符
运算符的使用和我们平时在java中的使用一样,无非就是
+ - * / % = ++ --
这几个符号,我觉得可以不用再说了,如不过原生的bash不支持简单的数学运算,可以通过其他命令实现如expr,简单来说你的表达式前面要加上expr这个命令,而且表达式和运算符之间要有空格,完整的表达式还要被反引号包含。另外自加需要用两个括号包含起来。
num=`expr 2 + 2`
echo "${num}"
e=1
((e++))
echo $e
字符串运算符
所谓字符串运算符就是对字符串进行比较的运算符,常见的运算符有
= 检测两个字符串是否相等
!= 检测两个字符串是否不相等
-z 检测字符串长度是否为0
-n 检测字符串长度是否不为0
$ 检测字符串是否为空,不为空返回true
举个例子
a="aaa"
b="bbb"
[ "${a}" = "${b}" ]
#用$?可以获取上一条语句的执行结果
echo $?
#输出0或1,0为真,1为假
[ $"{$a}" ]
#判断字符串是否为空
echo $?
顺便说一下,字符串和运算符之间要有空格,中括号和字符串也要空一格,不然输出结果不正确
关系运算符
关系运算符就是比较两个数之间的关系,不支持字符串,除非字符串的值是数字,如
-eq -ne -gt -lt -ge -le
一开始看上去不熟悉,但是这几个运算符就是equals,greater,lesster,not的缩写,所以第一个-eq,就是等于,-ne是不相等(not equals),-gt大于,-lt小于,-ge(greater or equals)大于等于,-le(lesster or equals)小于等,举个例子
a=33
b=44
[ "${a}" -eq "${b}" ]
echo $?
布尔运算符
! 取反运算
-o 或运算,有一个表达式为true则返回true
-a 与运算,两个表达式为true才返回true
举个例子
a=123
b=456
[ $a -lt 20 -o $b -gt 100 ]
echo $?
逻辑运算符
&& 运算符左右两边为true才返回true
|| 运算符只有两边为false才返回false
举个例子
a=100
b=101
[[ "${a}" -gt 99 || "${b}" -lt 100 ]]
echo $?
判断语句
说白点就是各种语言里面的if,else的语句
单分支
if [条件]
then
语句体
fi
双分支
if [条件]
then
语句体
else
语句体
fi
多分支
if [条件1]
then
语句体
elif [条件2]
语句体
elif
语句体
fi
举个栗子
a=123
b=456
if [ $a -gt $b ]
then
echo "true"
fi
选择语句
其实和Java里面是switch语句差不多
case 值 in
模式1)
语句体
;;
模式2)
语句体
;;
esac
举个例子
word="cxk"
case "${word}" in
"cxk")
echo "cxk"
;;
"xz")
echo "xz"
;;
esac
shell循环语句
if循环
for 变量 in 范围
do
循环体
done
举个栗子
for val in a b c d e
do
echo "${val}"
done
while循环
while 条件
do
循环体
done
举个栗子
a=1
while [ "${a}" -lt 10 ]
do
echo "${a}"
((a++))
done
函数
函数就是对功能的封装
没有参数的函数
test(){
echo "函数输出"
}
test
有参数没返回值的函数
test1(){
echo "第一个参数$1"
echo "第二个参数$2"
}
test1 3 5
有参数有返回值的函数
test2(){
echo "接收到参数$1和$2"
return $(($1 + $2))
}
test2 25 50
echo $?
键盘输入练习
#使用read关键字可以从键盘录入的数据赋值给变量
#如
read number
echo $number