Linux的Shell相关知识简要描述几种主流的shell及特点!!!

作者&投稿:薄废 (若有异议请与网页底部的电邮联系)
主流linux shell的特点~

Shell的概念最初是在Unix操作系统中形成和得到广泛应用的。Unix的Shell有很多种类,Linux系统继承了Unix系统中Shell的全部功能,现在默认使用的是bash。

Shell具有如下突出特点:

(1)把已有命令进行适当组合构成新的命令。

(2)提供了文件名扩展字符(通配符,如* 、 ?、 [ ]),使得用单一的字符串可以匹配多个文件名,省去键入一长串文件名的麻烦。

(3)可以直接使用Shell的内置命令,而不需创建新的进程,如Shell中提供的cd、echo、exit、pwd、kill等命令。为防止因某些Shell不支持这类命令而出现麻烦,许多命令都提供了对应的二进制代码,从而也可以在新进程中运行。

(4)Shell允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输。

(5)结构化的程序模块,提供了顺序流程控制、条件控制、循环控制等。

(6)Shell提供了在后台执行命令的能力。

(7)Shell提供了可配置的环境,允许创建和修改命令、命令提示符和其它的系统行为。

(8)Shell提供了一个高级的命令语言,能够创建从简单到复杂的程序。这些Shell程序称为Shell脚本,利用Shell脚本,可把用户编写的可执行程序与Unix命令结合在一起,当作新的命令使用,从而便于用户开发新的命令。

百度百科:shell,在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

类型:unix/linux下的bash / sh / ksh / csh/ zsh

个人用的多的有bash和zsh,zsh相对更好看,某些操作更方便。bash适用性更广,在它上面可以加载很多映射在path里面的程序,可以管理用户登陆。

Linux系统管理与服务器配置这本书上,在228页第17章。。。
我是这么做的,大家可以参考参考。。
?在网上搜索Linux的Shell相关知识简要描述几种主流的shell及特点;
答:Linux是由UNIX演化而来的,从而也继承了UNIX的sell,在大部分的UNIX系统。三种著名且广被支持的Shell是:Bourne shell(AT&T shell,在Linux下是BASH),
C shell(Berkeley shell,在Linux下是TCSH),Korn shell(Bourne shell的超集)。三种shell各有优缺点
Bourne shell是标准的UNIIX shell,是UNIX最初使用的shell,并且在每种UNIX上都可以使用,常被用来作为管理系统之用,它简洁,快速,多用于shell编程方面,但与用户的交互性较差
C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。 Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本,Linux下的C shell则更多的考虑到了用户界面的而友好性,
它支持不少新功能。例如:提供了一个命令列(command line)编辑程序,提供了命令列不全功能,提供了拼写更正功能。它能自动检测并更正在命令列拼错的命令或单字;
危险命令侦测并提醒的功能,避免用户小心执行rm*这种杀伤力极大的命令;提供常用命令的快捷方式
BASH shell是Linux下对Bourne shell向下兼容的一种shell,并融入许多C shell与Korn shell的功能

最常见的有:
Born shell: 最早,所有的Unix和Linux上肯定都能用
csh: 与C语言有些像,如果会C, 这个肯定觉得很容易
ksh: Korn shell, 比上两种要好。特别是可以修改指令行(command line editing), 真是不可少。
bash: Born again shell, 改进版的Born shell。大概是Linux上最常用的

个人认为从ksh或bash中选一即可。

什么是shell script

将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.

再加上些智能(条件/流控)控制,就变成了智能化脚本了.

变量

变量声明

bash中的变量无须声明,拿来就用.类型会根据赋予的值来决定

a=abc

b=123

c=(123)

d=$(uname -r)

unset a

declare -p var_name 可以查看

引用变量

在变量名前加上 $ 符号

echo $a

作用范围

全局

export var=abc

. 或 source

局部

子进程中

函数中

操作符

算术操作

+ - * / %

关系操作

< > <= >= == != && ||

测试操作

测试命令 test [ ] [[ ]] (( ))

1、测试文件状态

-d 目录

-s 文件长度 > 0、非空

-f 正规文件

-w 可写

-L 符号连接

-u 文件有 suid 位设置

-r 可读

-x 可执行

$ [ -w tmp.txt ]

$ echo $?

0

2、字符串测试

= 两个字符串相等

!= 两个字符串不相等

-z 空串

-n 非空串

$ VAR1='abc'

$ VAR2='123'

$ [ '$VAR1' = '$VAR2' ]

$ echo $?

1

3、测试数值

-eq 等于

-ne 不等于

-gt 大于

-lt 小于

-ge 大于等于

-le 小于等于

4. 拓展测试符号 [[ ]] (())

数字测试符号

# [ 10 < 2 ] # 语法错误

-bash: 2: 没有那个文件或目录

#

# [[ 2 > 10 ]] # 结果错误

# echo $?

0

# [[ 20 > 10 ]] # 正确

# echo $?

0

# (( 10 < 20 ))

# echo $?

0

字符测试

# [ "aa" = "aa" ]

# echo $?

0

# [[ "aa" = "aa" ]]

# echo $?

0

# (( "aa" = "aa" )) #结果错误

# echo $?

1

混合测试

# [ a = a -a 10 < 20 ]

-bash: 20: 没有那个文件或目录

结论:

比较数字,使用(( ))

其他测试使用 [[ ]]

包含数字比较的混合测试,使用标准语法

流控结构

if 分支结构

# cat my.sh

#!/bin/bash

var=/etc/init.d

if [[ -d $var ]]

then

echo "$var is directory."

elif [[ -b $var ]]

then

echo "$var is block device."

elif [[ -f $var ]]

then

echo "$var is a regular file."

else

echo "unknow."

fi

# 除了 -L -h 等于的文件测试遇到软连接都会用原文件测试

if 测试中还可以执行命令 根据命令的返回值做判断

# if cd / ;then echo Y ;fi

# if grep -q root /etc/passwd ;then echo Y ;fi

向脚本传递参数

# vim 2.sh

#!/bin/bash

echo '$0' $0

echo '$1' $1

echo '$2' $2

echo '$3' $3

echo '${10}' ${10}

echo '${11}' ${11}

echo '${12}' ${12}

echo '$$' $$

echo '$*' $*

echo '$@' $@

echo '$#' $#

echo '$?' $?

# $@ $* 在双引号(软引用)参数中有差异,$@会将引号内的多个参数当成一个参数,这会影响到$#的数量

修改脚本从参数中传递测试文件

# cat 1.sh

#!/bin/bash

if [[ -d $1 ]]

then

echo "$1 is directory."

elif [[ -b $1 ]]

then

echo "$1 is block device."

elif [[ -f $1 ]]

then

echo "$1 is a regular file."

else

echo "unknow."

fi

#讲讲for i in 语法

检查内网存活的IP

#!/bin/bash

for i in {1..254}

do

(ping -W 1 -c 1 192.168.1.$i &> /dev/null && echo 192.168.1.$i) &

done

让文件测试脚本支持多个参数

# vim 1.sh

#!/bin/bash

for i in $@

do

if [[ -d $i ]]

then

echo "$i is directory."

elif [[ -b $i ]]

then

echo "$i is block device."

elif [[ -f $i ]]

then

echo "$i is a regular file."

else

echo "unknow."

fi

done

修改脚本使脚本最多支持3个参数,多个参数或0个参数报错,并退出脚本.

[[ $# > 3 || $# = 0 ]] && echo "USAGE: $0 ERROR" && exit 1

使用测试

修改脚本告诉用户错误原因.

case 结构语法 用户登录欢迎

# cat 4.sh

#!/bin/bash

case $1 in

root)

echo "welcome $1"

;;

seker)

echo "welcome $1"

;;

*)

echo "no user $1"

esac

添加上与用户交互的功能

read -p "username: " uname

如果等待时间内用户没输入 则采用默认值

read -p "username: " -t 5 uname

echo

if [[ -z $uname ]]

then

uname=default

fi

case $uname in

root)

echo "welcome $uname"

;;

seker)

echo "welcome $uname"

;;

default)

echo "welcome $uname"

;;

*)

echo "no user $uname"

esac

再修改脚本 让用户输入密码

然后比对密码是否一致,如果不一致,则不显示欢迎信息

#cat 4.sh

#

read -p "username: " -t 5 uname

echo

stty -echo

read -sp "password: " paswd

stty echo

echo

if [[ -z $uname ]]

then

uname=default

fi

case $uname$paswd in

'root111')

echo "welcome $uname"

;;

'seker222')

echo "welcome $uname"

;;

'default333')

echo "welcome $uname"

;;

*)

echo "no user $uname"

esac

# case的字符测试还可以使用 | 结构 例如: a|b)

启动脚本

循环结构

while 语法

while (条件)

do

动作

done

需要无限循环时我们会选择while :

写个脚本 让用户输入,输入数字通过,输出错误重新输入

#!/bin/bash

retry=0

while [ $retry -eq 0 ]

do

read -p "enter a num : " aa

if expr $aa + 0 &> /dev/null

then

echo OK..

retry=1

else

echo "enter error.retry.."

fi

done

# cat 5.sh

#!/bin/bash

i=1

while (( $i < 10 ))

do

echo $i

((i++))

done

#

until 循环

# cat 6.sh

#!/bin/bash

i=1

until ! (( $i < 10 ))

do

echo $i

((i++))

done

# until是条件为假时进入循环

# while是条件为真时进入循环

# 对until条件取反 则等同于 while

C语言格式的for

for ((i=1;i<=10;i++))

do

echo $i

done

shell格式的for

for i in {1..10}

do

echo $i

done

循环控制

# for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done

# for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done

shift命令

# cat 8.sh

#!/bin/bash

while (($# != 0))

do

echo $1

shift

done

统计/dev下每种类型文件的数量

向脚本传递一个用户名,验证这个用户是否存在.

添加30个用户,再将它们删除

将$PATH中的找出所有加了SUID位的文件

FTP自动下载脚本

自定义函数

1.函数定义

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数

定义函数的格式:

function-name (){

command1

........

}

或 function function-name(){ #函数名前面多了个function关键字

command1

........

}

2.函数调用

以下是一个函数的脚本实例:

#!/bin/bash

#hello

function hello(){ #声明函数

echo "Hello!" #函数的主体,输出"Hello!"

} #函数结束

hello #调用函数

3.参数传递

向函数传递参数就像在脚本是使用变量位置$1,$2,$3...$9

以下是一个传递参数的实例:

#!/bin/bash

#hellofun

function hello(){

echo "Hello! The first parameter is '$1'."

}

hello good

#该脚本执行的结果是: Hello! The first parameter is 'good'.

4.函数文件

保存函数的文件,用以上的例子写成一个函数文件如下:

#!/bin/bash

#hellofunction

function hello(){

echo "Hello!"

return 1

}

上面的hellofunction文件就是一个函数文件,可通过另一个脚本来调用

#!/bin/bash

#hellof

. hellofunction #注意点和hellofunction之间有个空格

hello

5.载入和删除

用set查看已载入的函数

用unset function-name 取消载入

举例如下:

#!/bin/bash

#hellof

. hellofunction

unset hello

hello #因为已经取消载入。。所以会出错

6.函数返回状态

#!/bin/bash

#hellofun

function hello(){

echo "Hello! The first parameter is '$1'."

return 1

}

hello

echo $? #输出返回的状态值(一般成功是返回0,其它值为失败)

回收站 删

[root@stu254 dir]# cat /bin/del

#!/bin/bash

mkdir -p ~/.trash

for i in $*

do

$echo $i

mv -f $i ~/.trash

done &> /dev/null

[root@stu254 dir]#

回收站 恢复

[root@stu254 dir]# cat /bin/undel

#!/bin/bash

for i in $*

do

find ~/.trash -maxdepth 1 -name "$i" -exec mv {} . \;

done

[root@stu254 dir]#

数组

数组就是若干个变量组合在一起 每个变量的值都是数组的元素

元素都在数组中有一个下标 下标从0开始

数组赋值:

[root@stu254 dir]# ary=(root seker zorro blues pg)

取值方法:

第一个元素

[root@stu254 dir]# echo ${ary[0]}

root

[root@stu254 dir]#

第三个元素

[root@stu254 dir]# echo ${ary[2]}

zorro

[root@stu254 dir]#

所有元素

[root@stu254 dir]# echo ${ary[*]} ; echo ${ary[@]}

root seker zorro blues pg

root seker zorro blues pg

[root@stu254 dir]#

[root@stu254 dir]#

第二个到第四个元素

[root@stu254 dir]# echo ${ary[*]:1:3}

seker zorro blues

[root@stu254 dir]#

下标大于等于2的所有元素

[root@stu254 dir]# echo ${ary[*]:2}

seker zorro blues pg

[root@stu254 dir]#

下标小于2的所有元素

[root@stu254 dir]# echo ${ary[*]::2}

root seker

[root@stu254 dir]#

元素个数

[root@stu254 dir]# echo ${#ary[*]}

5

最后一个元素

[root@stu254 dir]# echo ${ary[$((${#ary[*]}-1))]}

4pg

倒数第2个元素

[root@stu254 dir]# echo ${ary[$((${#ary[*]}-2))]}

3blues

[root@stu254 dir]#

for批量对数组赋值

[root@stu254 dir]# ary=($(for i in {0..99};do echo $RANDOM;done))

[root@stu254 dir]# echo ${#ary[*]}

100

打印数组中所有的奇数和偶数

用数组个数中的奇数值覆盖偶数值,例如第1个元素覆盖第2个 第3个元素覆盖第4个元素

从文件中读取每行赋予一个数组的方法

生成随机数 赋予数组 进行排序

找出/etc/下最新的文件和最旧的文件 modify time

变量测试

${var-value} 和 ${var:-value}

- 号 如果变量设置为空则返回空值

:-号 如果变量设置为空则返回临时值

变量没声明 则临时赋值,否则使用原值

[root@stu254 ~]#

[root@stu254 ~]# unset var

[root@stu254 ~]# echo ${var-value}

value

[root@stu254 ~]# echo ${var:-value}

value

[root@stu254 ~]# var=123

[root@stu254 ~]# echo ${var-value}

123

[root@stu254 ~]# echo ${var:-value}

123

[root@stu254 ~]# var=""

[root@stu254 ~]# echo ${var-value}

[root@stu254 ~]# echo ${var:-value}

value

[root@stu254 ~]#

+ 号 如果变量

[root@stu254 ~]# unset var

[root@stu254 ~]# echo ${var+value}

[root@stu254 ~]# echo ${var:+value}

[root@stu254 ~]# var=123

[root@stu254 ~]# echo ${var+value}

value

[root@stu254 ~]# echo ${var:+value}

value

[root@stu254 ~]# var=""

[root@stu254 ~]# echo ${var+value}

value

[root@stu254 ~]# echo ${var:+value}

[root@stu254 ~]#

哥们,我也是东软的,求解啊

哥们,东软的吧,我们今天考,我们施刚带的,你呢


shell命令和linux命令一样么
shell与linux命令的区别:1、直接在命令行执行,就是在当前的shell环境下执行,比如涉及到一些环境变量的时候,必须在当前shell环境里执行。2、在脚本执行的话,会fork一个子进程,所有操作都在子进程中进行。如果涉及到一些在脚本里设置环境变量的东西,脚本结束了,环境变量就消失了,如果是修改环境变量...

linux中,怎么通过shell语句获取当前日期,输出格式要求20111224._百度...
获得当天的日期:date +%Y%m%d,输出: 20181130。需要使用今天之前或者往后的日期,这时可以使用date的 -d参数:1、获取明天的日期:date -d next-day +%Y%m%d。2、获取昨天的日期:date -d last-day +%Y%m%d。3、获取上个月的年和月:date -d last-month +%Y%m。4、获取下个月的年和月:...

linux怎么查用户shell
一、最常用的查看shell的命令,但不能实时反映当前shell [root@localhost ~]$ echo $SHELL \/bin\/bash 二、下面这个用法并不是所有shell都支持 [root@localhost ~]$ echo $0 -bash 三、环境变量中shell的匹配查找 [root@localhost ~]$ env | grep SHELL SHELL=\/bin\/bash 四、口令文件中shell的...

linux shell 指令 诸如-d, -f, -e之类的判断表达式
文件比较运算符-e filename 如果 filename存在,则为真 [ -e \/var\/log\/syslog ]-d filename 如果 filename为目录,则为真 [ -d \/tmp\/mydir ]-f filename 如果 filename为常规文件,则为真 [ -f \/usr\/bin\/grep ]-L filename 如果 filename为符号链接,则为真 [ -L ...

Linux操作系统的主要组成部分是什么?
目前主要有下列版本的shell:①Bourne shell:是贝尔实验室开发的。②BASH:是GNU的Bourne Again shell,是GNU操作系统上默认的shell,大部分Linux的发行套件使用的都是这种shell。③Korn shell:是对Bourne shell的发展,在大部分内容上与Bourne shell兼容。④C shell:是SUN公司shell的BSD版本。3、文件...

关于Linux ,Bash ,Shell的概念问题
《实战LINUX+SHELL编程与服务器管》shell编程,可以说直接反应出你对linux命令掌握的熟练度问题,什么情况下用哪种命令更符合 你的工作需求,怎么简化脚本运行过程,优化脚本让它更有效率。你在学习过程中必然会接触到sed,awk这种流编辑器。然后你还得学习sed,awk。渐渐地估计你就该选择一门更强大的编程...

Linux系统一般由哪4个部分组成?
一、Linux内核 内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP\/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。二、Linuxshell shell是系统的用户界面,提供了...

shell终端怎么进入?
1、首先在linux终端中创建一个shell脚本文件,例如shell.sh:2、使用vi shell.sh命令进入文件编辑模式即为shell编程模式,如图所示:3、进入编辑模式后在文本文件内输入#!\/bin\/bash echo "Hello World!" ,如下图:4、输入完成后:wq保存内容,回到了终端。5、在终端输入sh shell.sh就执行了脚本。

linux下如何通过shel语句获取当前日期?
var=`date +%Y%m%d`,echo var,你可以执行一下上面的命令,`不是单引号,是数字键1前面的那个键。第一句是把date +%Y%m%d这条命令的结果赋值给变量var,第二句是显示变量var的内容熟悉linux基础命令,请多看看《linux就该这么学》一书。

linux 命令中的sh是什么意思??
1、sh是linux中运行shell的命令,是shell的解释器,shell脚本是linux中壳层与命令行界面,用户可以在shell脚本输入命令来执行各种各样的任务。要运行shell脚本,首选需要给shell脚本权限,这里里以hello.sh文件为例,首先需要按下“crtl+shift+T”打开终端窗口:2、接着先给“hello.sh”文件添加x权限chmod ...

清河门区15749249141: Linux操作系统Shell基础知识要知道哪些?
漫都君福: 1 cat /etc/shells 查看计算机上可用的shell 2 编写shell,保存为firstscript #! /bin/bash# This is a test.echo -n Your current directory is:pwdecho $HOMEecho Your current ...

清河门区15749249141: Linux下的shell工作原理是什么? -
漫都君福: Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言、命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层.当从...

清河门区15749249141: Linux的Shell编程Shell基本语法有什么?
漫都君福: 其实作为命令语言互动式地解释和执行用户输入的命令只是Shell功能的一个方面,Shell还可以用来进行程序设计,它提供了定义变量和参数的手 段以及丰富的程序控制结...

清河门区15749249141: Linux Shell简介 -
漫都君福: 你可以理解为shell是内核与用户打交道的中间桥梁,其实就是解释命令的解释器.例如用户在终端输入一个命令,shell就向内核解释这个命令要实现的功能.

清河门区15749249141: 什么是Shell,它的作用是什么?
漫都君福: Shell字面理解就是个“壳”,是操作系统(内核)与用户之间的桥梁,充当命令解释器的作用,将用户输入的命令翻译给系统执行.Linux中的shell与Windows下的DOS一样,提供一些内建命令(shell命令)供用户使用,可以用这些命令编写shell脚本来完成复杂重复性的工作.

清河门区15749249141: 关于Linux的shell是什么东西 -
漫都君福: 就是你进入linux的,黑底白字,的命令行界面,那就是SHELL,不过SHELL 有很多版本,,,,这个是LINUX的最强大的一面,,,,,,

清河门区15749249141: 什么是shell以及如何编写最简单的shell -
漫都君福: shell是一种linux可以直接识别并执行的程序设计语言在开始前要明白shell脚本的后缀为.sh 在此我们用crt连接之前安装过vim的ubuntu做测试,来创建一个可以输出“Hello word!”的简单shell (1)首先创建一个hello.sh vim hello.sh (2)编写脚本 #!/bin/bash echo “Hello word!” 这里写图片描述 (3)对此文件加入可执行权限 chmod +x ./hello.sh 这里写图片描述 (4)执行之前的shell ./hello.sh 在下面就可以看到结果了

清河门区15749249141: shell命令是什么 -
漫都君福: 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command.com.它接收用户命令,然后调用相应的应用程序.同时它又是一种程序设计语言.作为命令语言,它交互式...

清河门区15749249141: shell linux下怎么理解 -
漫都君福: shell可以理解一种用户界面,你敲命令,它给你返回东西它其实是一种命令解析器,把你输入命令传递给linux内核,然后把内核执行命令后的结果返回给你 但我个人认为不能把它理解为编程语言

清河门区15749249141: 什么是shell脚本 -
漫都君福: shell脚本默认是Linux上的概念.shell是人机交互的接口,是包在Linux内核外的一个“壳”,翻译Linux用户输入的指令(shell命令)并交由内核执行.有点类似DOS.一组shell命令写在一个文件里,通过逻辑控制语句控制什么条件下执行什么语句,以完成特定的自动化操作任务.这个文件就是shell脚本.所做的任务可以是文本处理,可以是数学计算,可以是监控值守,可以是数据库操作,等等.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网