1: 什么是shell ?
Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。
─gnome-terminal-─┬─bash───pstree
终端进程 bash进程 pstree进程
Linux系统提供多种不同的Shell以供选择。常用的有Bourne Shell(简称sh)、C-Shelll(简称csh)、Korn Shell(简称ksh)和Bourne Again Shell (简称bash)。
在linux中可以通过 env命令 得到整个系统的环境变量,
其中
gec@gecubuntu:~$ env
SHELL=/bin/bash --- 当前选用的shell版本
2: bash命令
命令 命令选项 命令参数
ls -l file1 file2 --- 命令的参数1 2 3
3: shell 脚本
shell脚本的编写规则
1)指定对应的shell在哪里
#!/bin/bash
2)命令行操作
3)如果单独出现的是# 在shell脚本中表示注释 ,也就是不执行的语句
编写完脚本文件后,要注意修改脚本文件的操作权限,使其可以执行。
如果使用windows下的软件编写的shell脚本,通常在linux环境中是执行不了的,原因是windows中回车键对应的是\r\n,而linux中只认\n, 所以会提示/bin/bash\r找不到
4:常规要使用的命令
1)文本的输入输出
echo 内容 > 文件名 清空写入
echo 内容 >> 文件名 追加写入
RESULT=`whoami` 定义了一个变量RESULT
是波浪纹按键对应的反引号``,不是单引号’’!!!!
命令置换,可以实现把命令的输出结果当成是变量或者是其它命令的输入
所以,以上命令是把whoami命令的输出结果,当成是RESULT变量的输入
echo RESULT=$RESULT 使用变量的值
打印的是RESULT变量的值
5:shell脚本的基本语法
变量:让某一个特定字符串代表不固定的内容
1)用户自定义变量
变量名=初值
2)环境变量
PATH
SHELL
可以通过env命令得到全部环境变量列表
打印环境变量PATH值: echo $PATH
修改变量SHELL值: SHELL=/bin/sh
3)预定义变量
变量名 含义
$# 表示位置参数的数量
$* 表示所有位置参数的内容
$? 表示命令执行后返回的状态,用于检查上一个命令的执行是否正确;在Linux中,命令退出状态为0表示命令正确执行,任何非0值表示命令执行错误
$$ 表示当前进程的进程号
$! 表示后台运行的最后一个进程号
$0 表示当前执行的进程名
5)其他
变量的输出 -----相当于C语言中的 extern
export DAY
自定义变量的清除
unset DAY
变量与变量内容以一个等号=来连结
等号两边不能直接接空格符
变量名称只能是英文字母与数字,但是开头字符不能是数字变量内容若有空格符可使用双引号"或单引号’将变量内容结合起来
双引号内的特殊字符如$等,可以保有原本的特性可用跳脱字符 \ 将特殊符号变成一般字符;
在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。
若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容
若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量。
输入输出语句
echo “hello world”
echo “hello $name” name变量的值会打印出来
-e 表示解析转义字符
-n 回车不换行
linux默认回车换行
控制字符:\c--不换行;\t--跳格;\n--换行
从键盘上键入值 使用read 变量名
如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到回车。如果给出了两个变量,
shell将用空格作为变量之间的分隔符。如果变量数少于单词数,那么第一个单词将被赋给第一个变量,
字符串后面的部分将被全部赋给第二个变量。
command 1> file
command > file 把标准输出重定向到一个新文件中
command 1>> file
command >> file 把标准输出重定向到一个文件中(追加)
command 2> file 把标准错误重定向到一个文件中
command 2>> file 把标准输出重定向到一个文件中(追加)
command < file
command 0< file command命令以file文件作为标准输入
控制流语句
分支跳转
if
1)if [ command ]; then
other commands
fi
2)if [ command ]
then
other commands
fi
3)if [ command ]; then
other commands
else
other commands
fi
#如果输入值比10小就输出一个less, 否则输出more
#!/bin/bash
read num
if [ $num -le 10 ] ;then
echo LESS or EQUAL!
else
echo MORE!!
fi
4)
case $变量名称 in <==关键词为 case
“第一个变量内容”) <==变量内容建议用双引号括起来,关键词则为小括号 )
程序段
;; <==每个类型结尾使用两个连续的分号来处理!
“第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac <==最终的 case 结尾!『反过来写』思考一下!
#输入“zhangsan” 显示“优秀”
#输入“lisi” 显示“soso ”
#输入“wangwu” 显示“so bad”
#!/bin/bash
read -p "please enter a name: " name
case $name in
"zhangsan")
echo 优秀!
;;
"lisi")
echo soso
;;
"wangwu")
echo so bad
;;
*)
echo error input!!
;;
esac
循环控制while
while [ condition ] <==中括号内的状态就是判断式(如果为真则执行循环体)
do <==do 是循环的开始!
程序段落
done <==done 是循环的结束
while : 表示恒为真
#从键盘得到10个数据,得到10个数据的最大值
#!/bin/bash
cnt=10
max=
while [ $cnt -gt 0 ]
do
read -p "please enter: " num
if [ -z $num ]
then
continue
fi
if [ $cnt -eq 10 ]
then
max=$num
else
if test $max -lt $num
then
max=$num
fi
fi
cnt=$(($cnt-1))
echo cnt=$cnt
done
echo the max number is $max
for
for var in con1 con2 ... 令var值依次取列表中的值
do
程序段
done
#打印指定目录下的所有目录项, 说明是普通文件还是目录文件
#!/bin/bash
for name in `ls $1`
do
if [ -d $1/$name ]
then
echo $name is dir
else
echo $name is file
fi
done
判断语句
数值测试:
1)数值比较使用的是SHELL表达方法 test语句
算术比较 结果
expr1 –eq expr2 两个表达式相等则结果为真
expr1 –ne expr2 两个表达式不等则结果为真 no equal
expr1 –gt expr2 expr1 大于 expr2 则结果为真 great than
expr1 –ge expr2 expr1 大于或等于 expr2 则结果为真 great or equal
expr1 –lt expr2 expr1 小于 expr2 则结果为真
expr1 –le expr2 expr1 小于或等于 expr2 则结果为真
if [ $cnt -lt 10 ]相当于if test $cnt -lt 10
2)数值比较也可以使用C语言写法
expr 命令可以直接进行数学运算
等价于$(( argument operator argument ))
数值运算
cnt=$(($cnt-1)) 相当于cnt=`expr $cnt-1 `
#从键盘输入两个数值和它们对应的运算符
#! /bin/bash
while :
do
read -p "please input 运算表达式 :" num1 fuhao num2
result=$(($num1 $fuhao $num2))
echo result=$result
done
3)字符串测试 test [ ]
操作符 含义(真)
= 相等
!= 不等
-z 空串
-n 非空串
4)文件状态测试 test
文件条件测试 结果
-e file 文件存在则结果为真 exist
-d file 文件是一个子目录则结果为真
-f file 文件是一个普通文件则结果为真
-s file 文件的长度不为零则结果为真 size
-r file 文件可读则结果为真
-w file 文件可写则结果为真
-x file 文件可执行则结果为真
5)逻辑测试
逻辑操作 结果
! expr 逻辑表达式求反
expr1 –a expr2 两个逻辑表达式“And”(“与”)
expr1 –o expr2 两个逻辑表达式“Or”(“或”)
定义一个数组
变量名=(元素的值用空格隔开 )
用${数组变量名[下标]}表示对应的数组元素
要通配数组中的每个元素 使用 ${数组名[*]}
要表示整个数组的所有元素 使用 ${数组名[@]} at
要重新对数组元素进行赋值 数组名[下标]=新值
不需要事先确定数组的大小,可以调整
#定义一个数组, 给数组赋值并打印出最终的数组值
#!/bin/bash
arr=(15 26 8 4 5)
#arr=
#echo ${arr[0]}
for i in ${arr[*]}
do
echo $i
done
for j in `seq 0 7`
do
read -p "please enter a num: " arr[$j]
done
echo ${arr[@]}
函数的定义
function 函数名()
{
}
函数名()
{
}
函数调用
直接写函数名
如果需要给函数传入参数, 直接在函数名后写参数
return 返回值
可以使用$? 查看函数的返回值
#!/bin/bash
hello ( )
{
echo "hello world"
echo $0 # ---------- 表示的是进程名!!!!
echo $1 # 函数调用时候传入的参数
echo $2
echo $3
}
echo $1 $2 $3 # SHELL脚本执行时候传入的参数
echo "start"
hello
echo "2nd"
hello apple tree boy # 传入了3个函数的参数
echo "3rd"
hello $1 $2 $3 #shell执行时候传入的参数传给了函数
echo "end"
linux shell
于 2019-07-13 23:03:27 首次发布