shell编程入门、shell编程的基础知识(变量、命令、运算)、shell编程的语句

shell编程

示例1

ex1 文件内容如下:

#!/bin/sh

#This is to show what a example looks like.

echo "My First Shell!"

echo "This is current directory."

/bin/pwd

echo

echo "This is files."

/bin/ls

使用sh example 运行当前shell 文件 (example:文件名)

注意:

Shell 脚本以.sh 结尾

运行后结果:

 

ex1 文件内容详解:

#!/bin/sh   shell 脚本文件开头内容固定格式

#This is to show what a example looks like. #是注释类似于Java中的// 或 /**/

echo "My First Shell!"  echo 是输出类似于Java中的System.out.println("My First Shell!");

shell 最主要的作用是执行一些命令

/bin/pwd  shell中要是用绝对路径

echo  输出空行相当于Java中空的System.out.println

echo "This is files."  输出语句

/bin/ls 列出当前文件所在文件目录的文件列表

 shell应用实例

如果我们想使用Shell脚钵,指定个计划任务,比如每周的周一到周五给管理员发一个信息(比如当前主机的信息,如内存使用情况,在线人数,磁盘空间等)

ex2文件内容:

#!/bin/sh

/bin/date +%F >> /test/shelldir/ex2.info

echo "disk info:" >> /test/shelldir/ex2.info

/bin/df -h >> /test/shelldir/ex2.info

echo >> /test/shelldir/ex2.info

echo "online users:" >> /test/shelldir/ex2.info

/usr/bin/who | /bin/grep -v root >> /test/shelldir/ex2.info

echo "memory info:" >> /test/shelldir/ex2.info

/usr/bin/free -m >> /test/shelldir/ex2.info

echo >> /test/shelldir/ex2.info

#write root

/usr/bin/write root < /test/shelldir/ex2.info && /bin/rm /test/shelldir/ex2.info

#crontab -e

#0 9 * * 1-5 /bin /sh /test/ex2.sh

ex2文件内容详解:

#!/bin/sh   固定格式

/bin/date +%F >> /test/shelldir/ex2.info  bin文件加下的data命令转换日期格式输入到

/test/shelldir/ex2.info 文件中,如果没有这个文件就会创建一个新的文件

+%F 转换日期格式

>>  追加输出(俩大于号追加输出  )

>  覆盖掉原有信息

echo "disk info:" >> /test/shelldir/ex2.info  追加disk info:(输出磁盘信息)到/test/shelldir/ex2.info文件中

/bin/df -h >> /test/shelldir/ex2.info    把磁盘信息追加到 /test/shelldir/ex2.info文件中

输入/bin/df -h 显示:

系统文件、大小、已用、剩余、使用百分比、目录 等信息

echo >> /test/shelldir/ex2.info  把一个空行追加到 /test/shelldir/ex2.info中

echo "online users:" >> /test/shelldir/ex2.info  把online users:追加输入到/test/shelldir/ex2.info中

/usr/bin/who | /bin/grep -v root >> /test/shelldir/ex2.info 

把当前登录人的信息输出作为/bin/grep的输入,排除root用户追加输入到/test/shelldir/ex2.info中

/usr/bin/who 当前登录人

-v:排除

使用的命令一般在/bin 下 和 /usr/bin 下

/usr/bin 一般使用root登录时使用

 

 

echo "memory info:" >> /test/shelldir/ex2.info  把memory info:追加输入到 /test/shelldir/ex2.info中

/usr/bin/free -m >> /test/shelldir/ex2.info 把内存信息追加输入到 /test/shelldir/ex2.info中

/usr/bin/free -m 显示内存信息

echo >> /test/shelldir/ex2.info 追加输入到/test/shelldir/ex2.info中

#write root

/usr/bin/write root < /test/shelldir/ex2.info && /bin/rm /test/shelldir/ex2.info  

把/test/shelldir/ex2.info文件中的信息写给管理员root用户 并且写成功之后 删除 /test/shelldir/ex2.info文件

 < 写给

&& 如果成功的话  && 的前边后边都执行如果失败则不执行

rm 删除命令

#crontab -e  定时执行命令

#0 9 * * 1-5 /bin /sh /test/shelldir/ex2.sh    每周一到周五执行 ex2.sh 脚本

0 9 * * 1-5 格式:分时天月星期

如果注释掉 && /bin/rm /test/shelldir/ex2.info后执行 sh ex2.sh结果如下

将返回信息写给了当前本机root用户

如果将&& /bin/rm /test/shelldir/ex2.info 注释放开执行之后,就将 /test/shelldir/ex2.info文件删除了

Linux替换命令:

%s/old/new/g

如果替换的内容中有 / 需要  %s+/test/shelldir/ex2.info+/test/shelldir/ex2.info/g 用+表示分隔

shell 编程的基础知识(变量、命令、运算)

shell 的变量

变量是shell传递数据的一种方法,用来代表每个取值的符号名

Shell有两类变量:临时变量和永久变量。

临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括。用户自定义变量、位置变量。

永久变量是环境交量,其值不随shell脚本的执行结束而消失.

关于临时变量和永久变量的理解:

临时变量:相当于在shell脚本中写的变量,这个变量只在脚本内部用

永久变量: 在整个linux系统中都可以用相当于全局变量,类似于Java环境变量中的path

永久变量:

解析:

echo $PATH 输出$PATH 输出当前计算机Linux的环境变量目录

echo $LANG 输出当前计算机Linux的字符集

变量的自定义:

用户定义的变量由字母或下划线开头,由字母、数字或下划线序列组成,并且大小写字母意义不同。变量名长度没有限制。在使用变量值时,要在变量名前加上前缀“$”。一般变量使用大写字母表示(小写也可以),并且是英文字母开头,赋值号“=”两边应没有空格,如NUM=5、STR=""A String"

可以将一个命令的执行结果赋值给变量:但是需要使用命令替换符号

注意单引号和双引号的区别,“”号是会把里面的变量值进行输出,‘’是会把内容原封不动输出,不会识别里面的变量。

使用set命令查看所有的变量(当前系统中所有的变量)。

使用unset命令删除指定的变量。

命令替换符号:如图所示键盘按钮在英文状态下的``

自定义变量:

 使用set命令:获取当前系统下所有变量

 使用unset命令:

 

P1 = 10 设置自定义变量P1等于10

echo $P1 输出变量P1

P1=500 修改变量值 P1为500

cho $P1 输出变量P1

P1=”A string" 修改变量值 P1为A string

set l grep P1  取出全部变量并过滤P1

P1=`date` 把data的执行结果原封不用的赋值给P1

echo $P1  输出P1变量

P2=$P1  把P1的值赋值给P2

echo $P2 输出P2

P2=”time is $P1” 把P2的值设置成time is $P1

echo $P2 输出P2

在Shell里面还有俩种特殊的变量,一种是位置变量, 还有种是特殊的变量,在我们编

写Shell的时候十分的常用,一定要熟悉他们。

位置变量: Is -l file1 file2 fle3...(n范围=149) 在代码里使用$0-9进行替代

 Is -l  打印当前目录的所有信息  

file1 file2 file3...  都是占位的参数,最多只能到file9

es3文件内容::

#!/bin/sh

DATE=`/bin/date +%Y%m%d`

echo "TODAY IS $DATE"

/bin/ls -l $1

/bin/ls -l $2

/bin/ls -l $3

es3文件详解

#!/bin/sh

DATE=`/bin/date +%Y%m%d`  声明变量DATE  `` 是命令替换符 把命令/bin/date +%Y%m%d的执行结果赋值给DATA

echo "TODAY IS $DATE" 输出 TODAY IS $DATE     $DATE 是变量

/bin/ls -l $1  

/bin/ls -l $2

/bin/ls -l $3

 $1、 $2、 $3:占位符在执行脚本的时候需要将占位符的位置进行补全

注意:$0是shell执行文件本身,$1到$9是可以传递的参数最多9个

/bin/ls -l 绝对路径下的文件列表

 ls -l 相对路径下的文件列表

查看test目录下的文件信息

es3文件执行结果:

特殊变量:

$*这个程序的所有参数(当前执行的.sh文件所有参数)

$#这个程序的参数个数(当前执行的.sh文件所有参数个数)

$$这个程序的PID

$!执行上一个后台命令的PID

$?执行上一个命令的返回值

$(0-9)显示位置变量

es4文件内容:

#!/bin/sh

DATE=`/bin/date +%F`

echo "today is $DATE"

echo '$# :' $#

echo '$* :' $*

echo '$? :' $?

echo '$$ :' $$

echo '$0 :' $0

单引号包裹的内容原样输出

es4文件执行结果:

 

键盘录入:
命令: read从键盘读入数据,赋给变量。(类似Java中的scanner )

es5文件内容

#!/bin/sh

read f s t

echo "the first is $f"

echo "the second is $s"

echo "the third is $t"

es5内容详解

#!/bin/sh

read f s t          f s t  三个变量 外部脚本指定的时候要传递这三个参数然后输出打印

echo "the first is $f"

echo "the second is $s"

echo "the third is $t"

 在输入的时候

sh ex5.sh  

10 20 30

执行结果:

 

在执行的时候可以加-x选项表示跟踪,用于脚本调试

在输入的时候

sh -x ex5.sh  

之后出现

+ read f s t   ( + 表示当前脚本执行到哪了,然后输入 30 50 80 )

30 50 80

执行结果

 

Shell运算

expr命令,对整数进行运算(只能计算整数)

注意点:

1 expr的运算必须用空格间隔开。

2*表示转义字符。

3保持先算乘除后算加减,如果需要优先运算则需要加命令替换符。

4也可以对变量进行运算操作。

[root@bhz004 test] # NUM=30     //声明一个变量等于30

[root@bhz004 test]# echc `expr $NUM + 8 ` 输出这个变量+8

expr 不能计算小数

 

使用test命令可以对文件、字符串等进行测试,一般配合控制语句使用,不应该单独使用。如下:

字符串测试:

test str1=str2测试字符串是否相等

test str1!=str2测试字符串是否不相等

test str1测试字符串是否不为空

test -n str1测试字符串是否不为空

test -z str1测试字符串是否为空

int测试:

test int1-eq int2测试整数是否相等

test int1 -ne 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 -d file指定文件是否目录

test f file  指定文件是否常规文件

test -x file指定文件是否可执行

test -r file指定文件是否可读

test -w file指定文件是否可写

test -a file指定文件是否存在

test s file文件的大小是否非0

test 命令都是在shell脚本里面配合if else  if 执行的

If语法

语法格式:   if test -d $1 then  .….  else  ...  fi

变量测试语句可用[]进行简化,如test -d $1等价于[-d $1 ]

注意:["空格"-d $1"空格"]

es6 内容:

#!/bin/sh

# if test $1 then ... else ... fi

if [ -d $1 ]

then

echo "this is a directory!"

else

echo "this is not a directory!"

fi

 es6 内容详解:

#!/bin/sh

# if test $1 then ... else ... fi

if [ -d $1 ]    //等价于  if test -d $1   判断这个参数是否是一个文件夹

then

echo "this is a directory!"   // 如果是文件夹输出

else

echo "this is not a directory!"   //如果不是文件夹输出

fi

注意结尾处 if 的写法 极度恶心  fi

输出结果:

 

 语法有错误会提示提示示例如下:

 以下示例也是错的

这里执行之后会报错

 

注意空格,注意编码格式!!!!!!!!

es7内容:

#!/bin/sh

# if test  then ... elif test then ... else ... fi

if [ -d $1 ]

then

echo "is a directory!"

elif [ -f $1 ]

then

echo "is a file!"

else

echo "error!"

fi

es7内容详解:

#!/bin/sh

# if test  then ... elif test then ... else ... fi

if [ -d $1 ]

then

echo "is a directory!"

elif [ -f $1 ]

then

echo "is a file!"

else

echo "error!"

fi

如果是文件夹输出is a directory!如果是文件输出is a file!否则就是输出error

执行结果:

 

逻辑与逻辑或

es8内容:

#!/bin/sh

# -a -o

if [ $1 -eq $2 -a $1 = 1 ]

then

echo "param1 == param2 and param1 = 1"

elif [ $1 -ne $2 -o $1 = 2  ]

then

echo  "param1 != param2 or param1 = 2"

else

  echo "others"

fi

es8内容详解

#!/bin/sh

# -a -o

if [ $1 -eq $2 -a $1 = 1 ]  如果第一个参数和第二个参数相等并且第一个参数等于1

then

echo "param1 == param2 and param1 = 1"  输出param1 == param2 and param1 = 1

elif [ $1 -ne $2 -o $1 = 2  ]  如果第一个参数不等于第二个参数或者第一个参数等于2

then

echo  "param1 != param2 or param1 = 2"   输出param1 != param2 or param1 = 2

else

  echo "others"  否则输出others

fi

执行结果:

for循环:

 

es9内容

#!/bin/sh

# for var in [params] do ... done

for var in 1 2 3 4 5 6 7 8 9 10

do

echo "number is $var"

done

es9内容详解:
#!/bin/sh

# for var in [params] do ... done

for var in 1 2 3 4 5 6 7 8 9 10    循环的内容都需要写出来

do

echo "number is $var"

done

Select循环:

es10 内容:

 #!/bin/sh

# select var in [params] do ... done

select var in "java" "c++" "php" "linux" "python" "ruby" "c#"   

do

    break

done

echo "you selected $var"

es10内容执行结果:

 case语句

 

es11内容:

#!/bin/sh

read op

case $op in

    a)

  echo "you selected a";;

    b)

echo "you selected b";;

c)

echo "you selected c";;

*)

echo "error"

esac

es11内容详解:

#!/bin/sh

read op   从外部读取变量op

case $op in

    a)

  echo "you selected a";;     如果输入a输出you selected a

    b)

echo "you selected b";;

c)

echo "you selected c";;

*)

echo "error"

esac        注意结尾

执行结果:

While语法

 

es12内容:

#!/bin/sh

#while test do ... done

num=1

sum=0

while [ $num -le 100 ]

do

sum=`expr $sum + $num`

num=`expr $num + 1`

done

#sleep 5

echo $sum

es12内容详解:
#!/bin/sh

#while test do ... done

num=1

sum=0     声明两个变量num 和sun

while [ $num -le 100 ]   如果num 小于等于100

do

sum=`expr $sum + $num`   把 $sum + $num的运算结果赋值给sun

num=`expr $num + 1`        $num + 1 的运算结果赋值给num

done

#sleep 5             等5s后输出

echo $sum           输出5050

执行结果:

continue 和 break 语法

es13  内容:

#!/bin/sh

i=0

while [ $i -le 100 ]

do

i=`expr $i + 1`

if [ $i -eq 5 -o $i -eq 10 ]

then continue;

else

echo "this number is $i"

fi

if [ $i -eq 15 ]

then break;

        fi

done

es13  内容详解:

#!/bin/sh

i=0       声明白能量i=0

while [ $i -le 100 ]    i小于等于100 执行循环体

do

i=`expr $i + 1`   $i + 1 的值赋值给i

if [ $i -eq 5 -o $i -eq 10 ]   如果i 等于5 或 i 等于10

then continue;      跳过当前循环

else

echo "this number is $i"   否则输出当前i的值

fi

if [ $i -eq 15 ]     如果i等于15 退出while循环

then break;

        fi

done

执行结果:

当前结果没有等于10 的页没有等于5的,等于15退出循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值