Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行
由于历史原因,UNIX系统上有很多种Shell:
(1) sh(Bourne Shell)
由Steve Bourne开发,各种UNIX系统都配有sh。
(2) csh(C Shell)
由Bill Joy开发,随BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能:作业控制,命令历史,命令行编辑。
(3)ksh(Korn Shell)
由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链接。
(4)tcsh(TENEX C Shell)
是csh的增强版本,引入了命令补全等功能,在FreeBSD、MacOS X等系统上替代了csh。
(5)bash(Bourne Again Shell)
由GNU开发的Shell,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多不同的,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,有些行为并不一致,所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,bash可以假装自己是sh,不认扩展的命令,并且行为与sh保持一致。
一、最简单的shell
1、Shell的结构:
(1)、#!指定执行脚本的shell
(2)、#注释行
(3)、控制结构
2、创建shell的步骤:
(1)、使用vi编辑器创建以.sh结尾的文件 :vi demo.sh
(2)、编辑相关shell程序,编写完毕后加执行权限:
chmod u+x demo.sh
(3)、执行程序 ./demo.sh
也可以使用sh demo.sh来执行
使用 sh -x demo.sh中的x表示脚本的执行过程
使用 sh -n demo.sh不执行脚本,只是检查语法的错误,返回所有错误信息
二、shell的变量
Shell变量包括:临时变量和环境变量,临时变量时shell程序内部定义的,对其他程序不可见,包括用户自定义变量和位置变量;环境变量就是全局变量,不随着shell脚本的结束而消失。
在使用变量值的时候,要在变量名前加前缀”#34;
变量赋值用”=”,注意两边不能有空格
变量赋值举例:
1、 NUM=1
2、将一个命令的执行结果赋给变量,例如
time=`date`
time=(date +%F) echo $time
3、将一个变量赋给另一个变量:A=$B
查看变量的值:echo $A
字符串用单引号或者双引号
双引号有自动解析变量的功能
例如:
sum=100
echo “The total is $sum”
set为显示所有的环境变量
删除变量unset
三、位置变量和特殊变量
1、位置变量
Shell解释执行用户命令的时候,将命令行的第一部分作为命令名,其他部分作为参数。有出现在命令行上的位置确定的参数成为位置参数
例如:ls -l file1 file2 file3
$0位置被个程序的文件名占用,其它剩余位置$1 $2 $3…$9
例如:在test.sh中有如下内容
mkdir files$1_s00$2_class$3
执行时候./test.sh 001 1 001,表示$0被test.sh占用、$1被001占用、1被$2占用,001被$3占用
2、特殊变量
$*这个程序的所有参数
$#这个程序的参数个数
$这个程序的 PID
$!执行上一个后台的PID
$?执行上一个命令的返回值
例如有test.sh程序,内容如下:
echo ‘$# is:’ $#
echo ‘$* is:’ $*
echo ‘$? is:’ $?
echo ‘$ is:’ $
echo ‘$0 is:’ $0
运行 ./test.sh p1 p2 p3 后查看结果
四、shell的一些常用命令
1、Read命令:从键盘读入数据,赋给变量
例如 read x 100 ; echo $x
如程序test.sh:
read a1 a2 a3
echo “the a1 value is $a1”
echo “the a2 value is $a2”
echo “the a3 value is $a3”
则执行的时候
./test.sh 100 200 300
2、expr指令:对整型变量进行算术运算
例如expr 100 + 200注意加号左右有空格
del@box:/temp$ expr 100 + 200
300
另外注意乘法为” \*”,要有转义符
例如3 \* 5
复杂的运算:expr `expr 6 + 9` / 3
将运算的结果赋予变量 x=`expr 1 + 2`
3、变量测试语句:
测试变量是否相等、为空等情况。语法:test 测试条件;测试范围:整数、字符串、文件
(1)字符串测试:
test str1=str2 测试字符串是否相等
test str1!=str2 测试字符串是否不相等
test str1 测试字符串是否不为空
test -n str1 测试字符串是否不为空
test -z str1 测试字符串是否为空
(3)测试整数
test int1 -eq int2 测试int1和int2是否相等
test int1 -ge int2 测试int1是否>=int2
test int1 -gt int2 测试int1是否>int2
test int1 -le int2 测试int1是否<=int2
test int1 -lt int2 测试int1是否<int2
test int1 -ne int2 测试int1和int2是否不相等
(4)文件测试
test -d file 指定文件是否目录
test -f file 指定文件是否常规文件
test -x file 指定文件是否可执行
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -a file 指定文件是否存在
test -s file 文件大小是否非0
测试语句一般不单独使用,一般配合if语句来判断,如:
if test -d $1 then
…….
fi
变量测试语句也可以用[]简化,例如:
test -d $1等价于 [ -d $1 ] 注意:中括号左右的表达式要有空格
五、流程控制
1、选择结构if语句
(1) If [ ]; then
fi
(2) If [ ]; then
else
fi
例如:
If [ $# -ne 2 ]; then
echo “not enough parameters”
exit 0 //0表示正常退出
fi
If[ $1 -eq $2 ];then
echo “$1 equals $2”
fi
(3) If [ ] then
elif [ ]
elif [ ]
else
例如:test.sh内容如下
read file_name
if [ -d $file_name ]
then
echo “This is directory!!!”
elif [ -f $file_name ]
then
echo “This is file!!!”
else
echo “This is nothing!!!”
fi
条件组合查询:
-a :逻辑与,条件都成立的时候结果为真
-o :逻辑或,只要有一个条件成立,结果为真
例如:test.sh内容如下
read file_name
if [ -d $file_name ]
then
echo “This is directory!!!”
elif [ -f $file_name ]
then
echo “This is file!!!”
elif [ -c $file_name -o -b $file_name ]
echo “This is device file!!!”
else
echo “This is nothing!!!”
fi
2、循环结构
(1)形式-1:for-in
语法:
for 变量 in 名字表
do
…..
done
例如:
for x in 11 22 33 44 55 66
do
echo “x value is : $x”
done
(2)形式-2:for
语法:
for ((初始值; 循环条件; 增量 ))
do
指令…
done
示例-1:输出1 2 3 4 5
for((i = 1;i <= 5;i++))
do
echo $i
done
示例-2:求1—100的和
for (( i=1; i<=100; i++ ))
do
sum=$(( $sum + $i ))
done
echo “1+2+3+…+100=$sum”
3、case语句
语法:
case “$variable” in
“$condition1” )
command…
;;
“$condition2” )
command…
;;
esac
对变量使用””并不是强制的, 因为不会发生单词分割
每句测试行, 都以右小括号)来结尾
每个条件判断语句块都以一对分号结尾 ;;
case块以esac (case的反向拼写)结尾
例如,有下列程序test.sh内容如下:
read c
case $c in
a)
echo “this is a”
;;
b)
echo “this is b”
;;
c)
echo “this is c”
;;
*)
echo “none”
esac
4、while循环
基本语法:
while [ condition ]
do
command1
command2
command3
done
例如,test.sh中的写法如下:
num=1
while [ $num -le 10 ]
do
sum=`expr $num \* $num`
echo $sum
num=`expr $num+1`
done
5、break和continue语句
break:结束循环
continue:结束本次循环,开始新的一轮循环
例如:
while true
do
echo “============================”
echo ” 1 add “
echo “2 delete “
echo “3 update”
echo “4 Quit”
read num_op
case $num_op in
1)
echo “this is add operation”
;;
2)
echo “this is delete operation”
;;
3)
echo “this is update operation”
;;
4)
echo “exit …..”
break
;;
esac
done
6、shift指令
参数左移:每执行一次,参数序列顺次左移一个位置,即$#的值减去1。其用于处理每个参数,移动出去的参数不能再用
例如,test.sh文件内容如下:
If [ $# -le 0 ]
then
echo “not enough parameters”
exit 0
Fi
Sum=0
While [ $# -gt 0 ]
sum=`expr $sum + $1`
shift
Done
Echo $sum
关注《大数据和人工智能交流》头条号,看高科技新动态,我是头条天涯雨科技作者,请大家多多支持、关注、点赞,谢谢!
《大数据和人工智能交流》的宗旨
1、将大数据和人工智能的专业数学:概率数理统计、线性代数、决策论、优化论、博弈论等数学模型变得通俗易懂。
2、将大数据和人工智能的专业涉及到的数据结构和算法:分类、聚类 、回归算法、概率等算法变得通俗易懂。
3、最新的高科技动态:数据采集方面的智能传感器技术;医疗大数据智能决策分析;物联网智慧城市等等。
根据初学者需要会有C语言、Java语言、Python语言、Scala函数式等目前主流计算机语言。
根据读者的需要有和人工智能相关的计算机科学与技术、电子技术、芯片技术等基础学科通俗易懂的文章。
今天的文章Linux的shell编程(你必看的linux的shell精彩总结)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7918.html