基础的shell脚本

Posted 飘然离去

tags:

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

shell编程必须知道的基本语法:

1. 如何使用多个命令

方法一:在终端上使用“;”来隔开不同的命令

方法二:创建一个shell 脚本

  1. 如何创建一个shell脚本-----shell脚本的基本格式

#!/bin/bash

#this is the first shell

date

who

#the end

3. 如何运行一个shell脚本程序

chmod u+x test

./test

  1. shell脚本中的echo命令------相当于c语言中的printf

·格式如下:

echo This is a test

echo This is a test to see if it will work

echo Rich says scripting is easy .

echo Lets see whos logged into the system:   

echo n 的用法

  1. 使用变量

a) 环境变量

b) 用户变量

在变量名字前面加上$符号来引用变量的值

如:

days=10

#等于号两边不能有空格

guest=Katie

echo $guest will visite us $days days after

  1. 反引号----shell脚本中最重要的特性之一,反引号允许你将shell命令的输出赋值给一个变量,注意shell中的变量不需要显式指定类型,系统会自动识别,可以直接调用

如:

testing=`date`

echo The date and time are:  $testing

一个让系统自动创建日志文件日期的方法:

today=`date +%y%m%d`

ls /usr/bin al > log.$today

  1. 重定向输入和输出

a) 输出重定向

command > outputfile

b) 输入重定向

command < inputfile

c) 内联输入重定向

command << marker

sentences

marker

  1. 管道 command | command

rpm qa | more

rpm qa | sort

  1. 如何在shell中进行数学运算

a) expr命令------只能进行整数类型的运算,且需要使用反引号来获取expr命令的输出

b) 使用方括号来代替expr命令进行运算

格式:var=$[ 运算表达式 ]

c) 进行浮点运算的解决方法,使用shell内建的bash计算器,小数点位数是由scale变量来控制的

如终端下使用:

bc q#终端输入

3.44 / 5

0#结果

scale=4#设置scale

3.44 / 5

.6880#结果

quit

shell脚本中使用:

格式:var=`echo options; expression | bc`

如:

#!/bin/bash

var1=`echo scale=4; 3.44 / 5 | bc`

echo The answer is $var1

如何进行多个表达式的运算:

#!/bin/bash

var1=10.46

var2=43.67

var3=33.2

var4=71

var5=`bc << EOF

scale=4

a1 = ($var1 * $var2)

a2 = ($var3 * $var4)

a1 + a2

EOF

`

  1. 命令的退出状态码,每个命令都有一个退出状态码,成功执行为0,不成功非0,用echo $?命令可以查看退出状态码,但是用exit 命令可以指定退出状态码的值

 

结构化命令编程:

  1. 使用if-then语句,格式如下:

if command

then

commands

fi

或者

if command ; then

commands

fi

  1. 使用if  then  else 语句,格式如下:

if command

then

commands

else

commands

fi

  1. 嵌套使用if,格式如下:

if command1

then

commands

elif command2

then

more commands

fi

  1. 前面所讲的if-else语句,if只能接受shell命令作为判断条件,不能接受普通的任意表达式,使用test可以克服这个缺点,格式如下:

if test condition

then

commands

fi

或者

if [ commands ]

then

commands

fi

test命令可以判断3类条件:

·数值比较

n1 eq n2;检查n1,n2是否相等

n1 ge n2;检查n1是否大于等于n2

n1 gt n2;检查n1是否大于n2

n1 le n2;检查n1是否小于等于n2

n1 -lt n2;检查n1是否小于n2

n1 ne n2;检查n1是否不等于n2

·字符串比较

str1 = str2;检查str1是否和str2相同

str1 != str2;检查str1是否和str2不同

str1 < str2

str1 > str2

-n str1;检查str1的长度是否非0

-z str1;检查str1的长度是否为0

·文件比较

-d file;检查file是否存在并是一个目录

-e file;检查file是否存在

-f file;检查file是否存在并是一个文件

-r file;检查file是否存在并可读

-s file;检查file是否存在并非空

-w file

-x file

-O file;检查file是否存在并属当前用户所有

-G file;检查file是否存在并且默认组与当前用户相同

file1 nt file2;检查file1是否比file2

file1 ot file2;检查field1是否比file2

  1. 前面我们所讲的if-then语法格式并不符合我们c语言中的格式,现在我们来讲一下if-then的高级特性

a) 使用双圆括号(有些地方称作双尖括号)允许你将高级数学表达式放入进行比较

如:if (( $var1 ** 2 > 90 ))

 then

commands

fi

双尖括号里面可以识别的命令符号:var++, var--, ++var, --var, !逻辑求反, ~位求反, **幂运算, <<, >>, &, |, &&, ||

有了这些,我们的shell就和c语言的语法比较接近了。

b) 使用双方括号[[ expression ]] 针对字符串进行比较的高级特性,对字符串进行模式匹配

如:

#!/bin/bash

if [[ $USR == r* ]]

then

echo Hello $USR

else

echo Sorry, I dont know you

fi

  1. case命令来替换if-then-else语句,对比c语言语法格式来学习

直接来例子进行比较:

例子1

#!/bin/bash

if  [ $USER = Rich ]

then

echo welcome $USER

elif  [ $USER = barbara ]

then

echo welcome $USER

elif [ $USER = testing ]

then

echo welcome $USER

else

echo sorry, you are not allowed here

fi

例子2

case $USER in

Rich | Barbara)

echo Welcome, $USER;;#注意结尾符号

testing)

echo Welcome, $USER, nice your visite;;

*)#相当于default

echo sorry, we are not allowed here;;

esac#结束标识

  1. 更多的结构化命令

a) for命令格式

for var in list

do

commands

done

var读取list里面的值进行遍历输出

如:

for test in Albame Alaska Arizona California

do

echo The next place is $test

done

 如:

for file in /etc/*

do

if [ -d $file ]

then

echo $file is a directory

elif [ -f $file ]

then

echo $file is a file

fi

done

b) c语言风格的for命令

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

do

echo  The number  is $a

done

c) while命令

格式:

while [ command ]

do

commands

done

如:

var1=10

while [ $var1 gt 0 ]

do

echo $var1

var1=$[ $var1  1 ]

done

d) until命令,与while命令工作的方式相反

格式:

until [ commands ]

do

commands

done

e) 嵌套循环

如:

for (( a = 1; a <= 3; a++ ))

do

echo Starting loop $a:

for (( b = 1; b <= 3; b++ ))

do

break 2

echo   Insert loop $b

done

done

循环语句一个比较有实际意义的用法是循环处理文件数据,如你可以编程实现逐行遍历/ets/passwd文件并输出内容,这里你需要将IFS变量的值改为冒号

f) break 命令和continue 命令

g) 处理循环的输出,你可以添加一个命令将循环的输出不显示在屏幕上,而是重定向到一个文件夹

只需要在done命令后加上如:done > output.txt

三.前面我们程序里面需要的变量都是预先定义赋好值的,不能进行交互式的输入,这在一般程序设计时是不可能的,现在我们讲一下如何向程序里面传递参数

1.第一种方法是用命令行参数来向程序传递参数

如:./test  3  5,这个命令行我们输入了三个参数,在程序里直接对应$0,$1,$2,它们相当于变量的名字,在程序里可以直接调用,相当于$1=3, $2=5$#表示传递给函数的参数个数。

2.另一种方法是用read命令,可以让你在程序执行期间进行输入,如:

echo n Enter your name:

read name

echo Hello $name, nice name.

从文件test中读取内容的方法:

count=1

cat test | while read line

do

echo Line $count: $line

count=$[ $count + 1 ]

done

echo I have finished read file

 

四.如何定时运行程序和如何让程序开机时运行

1.at 命令来计划执行作业

at [ -f  filename ] time

2. at命令只能让程序在某个时间只执行一次,运用cron时间表可以让我们实现定期要执行的脚本

cron时间表命令格式如下:

min hour dayofmonth month dayofweek command(脚本全路径)

  1. 开机时运行脚本,很简单,只要你将你要运行的脚本放在开机时需要执行的脚本文件夹下就可以了,当然具体执行的时候还涉及到很多内容,这里不详述了。

 

.shell脚本函数

1.基本脚本函数

(1).创建函数两种方法:

a.function name{

commands

}

b.  name( ) {

commands

}

如:

 

注意:每个函数名必须唯一,如果重新定义函数那么新定义将取代函数原先的定义,而这不会引发错误消息。

2.函数退出状态

Bash shell将函数看作小型脚本,并以退出状态结束,函数退出状态有三种方式

(1) 使用标准变量$?来确定函数的退出状态

(2) 使用return命令

 

(3) 使用函数输出

 

3.向函数传递参数

如下:

 

这里的函数所使用的参数值为私有的参数环境变量,所以函数无法从脚本命令行访问脚本参数值,即函数所使用的变量$1$2,不同于脚本主代码的变量$1$2,如果函数想使用,必须在调用该函数时手动传递这些数据。

4.函数使用的全局变量和局部变量

1)全局变量是在shell脚本内处处有效的变量。默认情况下,脚本中定义的变量都是全局变量,在函数外部定义的变量,在函数内部仍能正常访问

2)与全局变量相对,函数内部使用的变量可以称为局部变量,只需要在局部变量前面冠以local关键字,关键字local确保变量仅在函数内部使用,如果脚本在函数外部有同名变量,那么shell将能区分开这两个变量。

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

Shell脚本应用(shell脚本基础与shell变量)

Shell脚本应用(shell脚本基础与shell变量)

shell脚本基础知识详解

shell脚本基础

项目09 Shell脚本基础

Shell脚本 Shell脚本基础 使用Shell变量