Linux shell基础

Posted 米蓝

tags:

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

种类:cat /etc/shells 查看系统支持的shell

ash 占用资源最少的shell 只有24个内部命令。

bash linux默认使用的shell。可以使用doskey功能。可以自动补全.自带帮组文档。

ksh:功能很强大,支持很复杂的语法。可以直接写游戏。

csh:比较大的shell,符合c语言语法,基本覆盖c语言的功能。该shell指向/bin/tcsh 。也就是说 csh就是tcsh

zch:最大的shell之一。有84条内部命令。

set 查看所有的环境变量

用户的shell信息保存在/etc/passwd中。所以要为用户指定新的shell,最本质的做法就是对这个文件进行修改。

修改用户的shell:1、 usermod -s shellname username   如:usermod -s /bin/ksh xx1  2、 chsh -s shellname username

shell变量:跟windows的注册表差不多。安札变量的作用来分:环境变量(全局性的,无论谁登进去 都能看到)、本地变量(当前回话有效,退出会话,就会消失掉)。用set 命令查看。

当输入一个命令的时候,会到以下目录去搜索。

命令提示符的样式。\\u 当前登录的用户 \\h当前登录的主机 \\w 当前的目录所在

定义变量: abc=1234 或者 export abc=1234。当=两边有空格,必须用引号括起来。

$echo $变量名 查看某一个环境变量  $echo $JAVA_HOME

PATH:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

创建一个shell

vi test

#!/bin/bash 注释,哪个shell来执行。

cal 1 2017

date

w

存盘退出

执行 sh ./test  

chmod a+x ./test 增加可执行属性

./test 执行

 

环境变量设置

/etc/profile 对所有的shell有效

/etc/bashrc 对bash shell有效

/用户目录/.bashrc  

/用户目录/.bash_profile 对用户有效

实现 传参数   ./a1 $1 $2 $3……  

vi a1

al 1 $1

cal 2 $1

cal 3 $1

shift命令:将 参数左移的效果。

文件b的内容为

echo $1 $2 $3

shift

echo $1 $2 $3

./b a b c

执行结果

a b c

b c

将 $2左移变成$1 $3变成$2

循环控制: for while

文件a3的内容为:

for i in 1 2 3

do cal $i $1

done

执行  ./a3 2014   结果为 显示2014年头三个月

文件 a5 内容

for i

do cal $i 2014

done

执行 sh a5 3 5 6  结果为 显示2014年 3、5、6月日历。i没有指定具体的循环机的话,就会从执行参数中获取。

For语句

for <循环变量> [in <循环变量取值集>] do <命令清单>
done

#!/bin/bash for i
do cal $i 97 done 

 

控制流while也是一种循环控制结构,用法是:

while <判别命令>
do <命令清单>
done 

until控制流不while控制流用法类似,但作用相反。用法为:

until <判别命令>
do <命令清单>
done 

if else  语句:

#!/bin/bash
if test –w /dev/lp  #检车打印机准备好了没有
then echo Printer is ready... #显示Printer is ready

else echo Printer is not ready... 

fi 

case 语句:

 case <变量> in

<字符串1> ) {<命令清单1>};;

...

<字符串n> ) {<命令清单n>};;

esac 

例如:

#!/bin/bash

case $1 in

    China ) echo Beijing

    USA ) echo Washington

    British ) echo London

    Russia) echo Moskow

    France ) echo Paris

    * ) echo Out of my knowledge

esac

break和continue语句 跳出循环

break和continue的最大区别在于,break跳出整个循环,而contiune则跳过循环的当 前循环步。也就是说忽略了接下来的语句,直接跳到下一次循环。 

here文本

在shell脚本中,还可以利用所谓的“here文本”功能,即可在脚本文件中嵌入一段文档,作为脚本中所使用的命令 的标准输入。具体用法为:

<命令> <<!
<作为输入的文本内容>
! 其中“!”符号也可用“EOF”、“END”等替代。例如,以下shell脚本tel可以迚行电话号码查询: #!/bin/bash

a7的内容为:

#在<<!! 之间的文本中查找与输入相匹配的行。

grep $1 <<!
Huang W (020)81833222
Zhang QF (020)84185331
Liu T (010)65364321
MA QA (020)83304587

一般用在安装自动化里。比如安装mysql,会提示一些信息,必须输入yes或on。可以吧这些问题放到一个文档,进行自动化安装。

 

运行

sh a7 Zhang

返回结果

Zhang QF (020)84185331

在脚本中使用函数 直接使用函数名

#!/bin/bash

#function Time

Time()
{

#取出date +%R的返回值赋值给TM

TM=\'date +%R\'
echo "The system time now is ${TM}"
}
echo "now is going to the function Time"

#调用函数 Time
Time
echo "back from the funtion Time" 

向函数传递参数 函数名 参数1 参数2

#!/bin/sh

#function func_test

func_test()

{
echo "$1" #注有双引号是传递给函数的参数,没有双引号是 调用shell文件时的参数

}
echo "start function"

func_test china #china作为参数传递给func_test
echo "end of function" 

从函数中返回 return

#!/bin/sh

func_test()
{
if [ "$1" = "" ];

then

echo "none input"

return 0
else
echo "$1"

return 1
fi
}
func_test $1 

获取函数返回值 用$?

#!/bin/sh

func_test()
{
if [ "$1" = "" ];  #"$1"调用函数传进来的参数。

then

echo "none input"

return 0

else

echo "$1"

return 1

fi

}
func_test $1 #$1是 执行shell文件传递进来的参数

if [ $? = 0 ]; #用$?捕捉函数执行的返回值。

then

echo "ple check you input" else

echo "all is ok" fi 

条件测试:

 test <表达式>

 

常见用法如下:

常用测试文件状态

-e <文件名称>:<文件名称>指定的文件存在。

-<文件性质> <文件名称>:此处的<文件性质>可以是:b(块设备)、c(字符设备)、d(目录)、f(普通文件)、L(符号链接)、p(管道文件)、r(可读文件)、w(可写文件)、s(非0字节文件)、x(可执行文件)。此表达式表示<文件名称>所指定的文件存在并且具有指定的性质。

<文件名称1> -nt <文件名称2>:表示<文件名称1>所代表的文件比<文件名称2>所代表的文件更新。

<文件名称1> -ot <文件名称2>:表示<文件名称1>所代表的文件比<文件名称2>所代表的文件更旧。

字符串测试

常用测试字符串测试的<表达式>有:

-z <“字符串”>:字符串为空串。

-n <”字符串”>:字符串是非空串。

<字符串1> = <字符串2>:字符串1与字符串2相等。

<字符串1> != <字符串2>:字符串1与字符串2不相等。

! <表达式>:<表达式>不成立。

<表达式1> -a <表达式2>:<表达式1>与<表达式2>同时成立。

<表达式1> -o <表达式2>:<表达式1>或<表达式2>成立。

数值测试

常用于数值测试的<表达式>有:

<数值表达式1> <算符> <数值表达式2>,此处,<算符>可以是:

-eq:两者相等。

-he:两者不等。

-lt:前者小于后者。

-le:前者小于或等于后者。

-gt:前者大于后者。

-ge:前者大于或等于后者。

<数值表达式>可以是整数或用“-l <字符串>”来表示求字符串的长度。

expr用法

expr命令一般用于整数值,但也可用于字符串。一般格式为:

expr argument operator argument

expr也是一个手工命令行计算器,如图所示。

增加计数:

常常用于循环中,用法如下:

loop=0

loop=’expr $loop +1’

数值测试:

这里的数值测试并不是上面所讲到的数值测试,这里的数值测试是检查被测变量是否为整数。如下面:

前面我们已经定义了变量number,现在在提示符下输入如下:

expr $number + 100 > /dev/null 2>&1

echo $? 

系统返回 “0” 表示number变量为整数,自己动手用一个非整数的变量测试,观察系统返回的数值是否非0

模式匹配:

expr也有模式匹配功能。可以使用expr match STRING REGEXP计算字符串中字符数。“. *”意即任何字符重复0次或多次,如下:

docu=blue.doc

expr match $docu ".*"

8     (系统返回)

在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件名。如下面的命令:

expr match $value  "\\(.*\\).doc"

blue (系统返回)

 

 

命令如下:

test -e test

echo $?

返回0表示存在。1表示不存在。 在脚本里 不需要echo命令。

a6内容如下:

#/bin/bash

if [ $1 -eq 1 ];then

      echo "\\$1 is 1"

else  echo "\\$1 is not 1"

fi

 执行 sh a6 1  结果为 $1 is 1。sh a6 sdfkj  结果为 $1 is not 1。 中括号就相当于test

练习:

1 判定一个用参数指定的文件是否为可执行,如果不是,则改为可执行

if !(test -x a)

then

echo 执行chmod

chmod a+x a

else

echo 已有可写权限

fi

ls -l a

2 用while和until循环,实现输出某年前9个月月历的效果

i=1

while [ ${i} -le 9 ];

do

cal ${i} $1

let i=i+1

done

 

i=1

until [ ${i} -gt 9 ];

do

cal ${i} $1

let i=i+1

done

3 使用here文档写一个脚本,来实现删除某个指定文件时不用回答yes or no而直接删除,限定不能使用rm的-f开关

#!/bin/bash

rm -i $1 <<!

y         

4、写一个脚本,可以输出用参数指定的年,以及该年中某几个用参数指定的月的月历,月的个数是不固定的

i=1

while [ ${i} -le $2 ];

do

cal ${i} $1

let i=i+1

done

 

 

 

 

以上是关于Linux shell基础的主要内容,如果未能解决你的问题,请参考以下文章

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

20155307刘浩《网络对抗》逆向及Bof基础

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础

201555332盛照宗—网络对抗实验1—逆向与bof基础

linux学习19 shell脚本基础-bash脚本编程基础及配置文件