linux shell都有哪些 类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell都有哪些 类型相关的知识,希望对你有一定的参考价值。

2.4脚本语言的种类
2.4.1 Shell脚本语言的种类
Shell脚本语言是弱类型语言(无需定义变量的类型就可使用),在Unix/Linux中主要有两大类Shell,一类是Bourne shell,另一类是C shell。
1. Bourne shell
Bourne shell又包括Bourne shell (sh)、Korn shell (ksh)、Bourne Again Shell(bash)三种类型。
Bourne shell (sh)由AT&T的Steve Bourne开发,是标准的UNIX Shell,很多UNIX系统都配有sh。
Korn shell (ksh)由David Korn开发,是Bourne shell(sh)的超集合,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell,在这些系统上的/bin/sh往往是指向/bin/ksh的符号链接。
Bourne Again Shell即bash由GNU项目组开发,主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版默认配置的Shell,在Linux系统上的/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多的不同,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,它们有些行为并不一致,但大多数企业运维的情况下区别不大,特殊场景可以使用bash替代sh。
2. C shell
C shell又包括csh、tcsh两种类型。
csh由Berkeley大学开发,随BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能,例如:作业控制、别名、系统算术、命令历史、命令行编辑等。
tcsh是csh的增强版,加入了命令补全等功能,在FreeBSD、Mac OS X等系统上替代了csh。
以上介绍的这些Shell中,较为通用的是标准的Bourne shell (sh)和C shell (csh)。其中Bourne shell (sh)已经被Bourne Again shell (bash) 取代。
可通过以下命令查看CentOS7系统的Shell支持情况。
[root@oldboy ~]# cat /etc/shells
/bin/sh #<==这是Linux里常用的Shell,指向/bin/bash。
/bin/bash #<==这是Linux里常用的Shell,也是默认使用的Shell。
/usr/bin/sh
/usr/bin/bash
Linux系统中的主流Shell是bash,bash是由Bourne Shell(sh)发展而来的,但bash还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,如果你使用sh后发现结果和预期有差异,那么可以尝试使用bash替代sh。
内容来源:《跟老男孩学linux运维:Shell高级编程实战》第02章_Shell脚本初步入门
参考技术A 一般来说,shell可以分成两类。第一类是由Bourneshell衍生出来的包括
sh,ksh,bash,与zsh。第二类是由Cshell衍生出来的,包括csh与
tcsh。除此之外还有一个rc本回答被提问者采纳
参考技术B shell常用类型有bash、ash、ksh、csh、zsh等。默认的shell是每个用户帐号的一个参数。Linux中典型的默认shell是/bin/bash,不过也可以用其他的shell。具体的介绍可以参考《Linux就该这么学》。 参考技术C a、b、k、z都有。多数默认的是bash,也有默认为dash的。 参考技术D 基本如楼上所讲
有bourne shell贝尔实验室开发
bash GNU开发,bourne shell的升级
korn shell bourne shell的发展
C shell sun公司的
等等

linux shell脚本基本语法

判断文件类型的脚本

#!/bin/bash
echo -e "Please input a filename, I will check the filename's type and permission. \\n\\n"
read -p "Input a filename: " filename
test -z $filename && echo "you must input a filename. '" && exit 0
# 下面开始判断文件是否存在
test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0
# 开始判断文件属性
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writeale"
test -x $filename && perm="$perm executable"
# 开始输出信息
echo "The filename: $filename is a $filetype"
echo "And th permissions for you are : $perm"

变量替换

关于echo -e

关于test命令

关于-a到-z的含义

判断符号[]

使用 t e s t test test来判断终究还是麻烦了点,比如如果想知道 H O M E \\rm HOME HOME是否为空,只需要这样

[ -z "$HOME" ]

括号旁边都带个空格,用法和test基本一样

其中echo $?是查看上一条命令是否执行成功,若成功返回 0 0 0

− z   s t r i n g \\rm -z\\ string z string表示 s t r i n g \\rm string string长度为零时返回真

这里不为真,输出错误码 1 1 1

再比如判断两个变量是否相等

可以看到第一第二次表达式都是正确的,为什么第三次输出结果相反??

因为等于号旁边要加空格,不然等于号表示赋值而不是判断

带参数脚本

当文件名为par.sh时候,执行只需要输入文件名即可

但是我加上一下参数呢??比如我执行par.sh -a -t呢??

/path  opt1 opt2 opt3.....
$0	   $1   $2   $3  

如上所示,$0,$1等都是自带的参数,默认就给你读取下来了

执行脚本的文件存在变量$0中,后面的$1,$2…都是参数

$#:代表本次读取到的参数个数

$@:表示["$1" “$2” “$3”]

比如一下是一个接收两个参数的脚本,并依次打印两个参数是什么

#!/bin/bash
echo "The script name is ==>"$0" "
echo "Total parameter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0
echo "The 1st parameter==>$1"
echo "The 2nd parameter==>$2"
echo "\\$@=$@"
echo "\\$*=$*"

条件判断

i f if if判断式

判断一次

if [ 条件判断式 ]; then
	当判断式为真,执行的代码
fi #结束if的意思

判断多次

if [ 条件判断式1 ]; then
	当判断式一成立可执行的命令
elif [ 条件判断式2 ]; then
	当判断式二成立可执行的命令
else
	当上面的命令都不成立时执行的命令
fi

case…esac判断

和其他语言一样也有个 c a s e case case,基本语法大概是

case $变量名称 in
	"第一个变量内容“)
		程序段
		;;
	"第二个变量内容")
		程序段
		;;
	*)
		程序段
		;;
esac

以下是一个简单的判断用户输入的脚本

#!/bin/bash
echo "This program will print your selection !"
read -p "input your choice: " choice
case $choice in
    "one")
		echo "Your choice is one"
        ;;
    "two")
		echo "Your choice is two"
		;;
    *)
		echo "Usage $0 one|two"
		;;
esac

循环

w h i l e while while

while [ condition ]
do
	程序段
done

只要 c o n d i t i o n condition condition条件成立就一直执行下去


f o r for for

for var in con1 con2 con3...
do
	程序段
done

第一次循环 v a r = c o n 1 var=con1 var=con1,第二次循环 v a r = c o n 2 var=con2 var=con2…以此类推


for ((初始值;限制条件;赋值运算))

额,说的好难懂,其实和程序的 f o r for for循环没啥两样

看个例子就好了,比如用户输入一个 n n n,计算 ∑ i = 1 n i \\sum\\limits_i=1^ni i=1ni

#!/bin/bash
read -p "Please input a number, I will count for 1+2+...+your_input: " nu
sum1=0
for (( i=1; i<=$nu; i=i+1  ))
do
	sum1=$(($sum1+$i))
done
echo "for loop cal is $sum1"
declare -i sum2=$(($nu*($nu+1)/2))
echo "math plan cal is $sum2"

function函数

s h e l l shell shell里的代码从上至下执行,所以函数应该放在最开头

基本语法为

function fname()
	程序段

至于怎么传参数,和命令的使用规则是一样的

fname (变量1) (变量2)...

然后再 f n a m e fname fname函数内部,变量一自然就是$1了,注意函数内的$1不同于外部的$1.

一些简单的例子

判断网段下哪些主机是开着的

比如我虚拟机的网段是 192.168.10 192.168.10 192.168.10

我想看一下 192.168.10.1 − 192.168.10.100 192.168.10.1-192.168.10.100 192.168.10.1192.168.10.100 100 100 100 i p ip ip能不能 p i n g ping ping

#!/bin/bash
network="192.168.10."
for sitenu in 1..100	#1..100表示区间,也可以写作$(seq 1 100)
do
	ping -c 1 -w 1 $network$sitenu &> /dev/null && result=0 || result=1
	#开始显示结果是否是正常的
	if [ "$result" == 0 ]; then
		echo "Server $network$sitenu is UP; "
	else
		echo "Server $network$sitenu is DOWN; "
	fi
done

相信这段代码比较难理解

ping -c 1 -w 1 $network$sitenu &> /dev/null && result=0 || result=1

注意理解-c 1 p i n g ping ping的选项,表示期望收到 1 1 1次回应就算成功

-w 1也是 p i n g ping ping的选项,表示期限是 1 1 1秒,超过一秒就算失败

&> /dev/null是把前面命令的输出信息重定向搭配 / d e v / n u l l /dev/null /dev/null

后面的&& result=0 || result=1就是接收以下前面的一大串命令是否是成功的

输入一个路径,判断该路径下所有文件的权限

#!/bin/bash
read -p "Please input a directory: " dir
if [ "$dir" == "" ];then
	echo "The $dir is NOT exist in your system."
	exit 1
fi
# 开始正式测试文件
filelist=$( ls $dir )
for filename in $filelist
do 
	perm=""
	test -r "$dir/$filename" && perm="$perm readable"
        test -w "$dir/$filename" && perm="$perm write"
        test -x "$dir/$filename" && perm="$perm executable"
	echo $perm
	echo "The file $dir/$filename's permisson is $perm"
done

这个比较简单,就不解释了.

以上是关于linux shell都有哪些 类型的主要内容,如果未能解决你的问题,请参考以下文章

linux常用的shell都有哪些

linux的常见的分区类型都有哪些?

Linux中32位和64位数据类型长度都有哪些不同

shell类型

常见的shell有哪些

Linux文件系统中包括的主要文件类型都有哪些?