这两天初次接触shell编程,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。如果对windows的dos有了解,可以这样理解,其实shell脚本文件和.bat批处理文件差不多,不过linux下的shell比起windows的dos强大很多。

  shell有很多种,如bash、sh 、tcsh、 ksh等,linux系统里面默认使用的是bash。

  下面看一下学习shell的第一个程序:

  输入命令vi my_01.sh,创建一个my_01.sh文件并用vi编辑器打开。编辑内容如下:

 #!/bin/bash
echo "aaaa"
echo "第一次接触shell"

  这里第一行是指让bash这个shell去执行这个shell程序。echo是用来输出的,第二行和第三行分别输出两句话。

执行这个shell程序可以用如下几种方法:

  1  ./my_01.sh

  2  . my_01.sh

  3  bash my_01.sh

注:新创建的文件默认是没有执行权限的,所以必须给该文件授予执行权限后才能执行。授权命令:chmod u+x my_01.sh或者chmod 755 my_01.sh

  下面是第二个shell程序:

 #!/bin/bash
#my_02.sh
read -p "please input your name:" name
echo "$name,welcome!"

  这里第三行read命令是指等待用户输入,-p后面是指提示,它还有一个参数-t是设置等待时间的。这个程序运行结果如下:

[liuling@bogon test]$ ./my_02.sh
please input your name:liuling
liuling,welcome!

  注:第四行echo使用的是双引号,如果使用单引号的话,则这句就会直接输出 $name,welcome! 。双引号是可以解析里面的变量的,而单引号则不行。

下面看看shell脚本的语法:

一、条件判断if else的使用

if分支语句的写法:

if 条件测试
then 满足条件执行什么
else 不满足条件执行什么
fi

多分支写法:

if 条件1
then
执行命令2
elif 条件1
then
执行命令2
else
执行命令3
fi

   注:if和fi要配对,以fi结束这个条件判断。在不满足第一个条件下再判断使用的是elif,而不是else if。then必须独占一行。

下面看几个例子:

 #!/bin/bash
#my_03.sh read -p "pelease input your name:" name
read -p "pleaase input your password:" passwd
#if test $name = "liuling"
if [ $name = "liuling" -a $passwd = "lz19921009" ]
then
echo "登录成功!"
else
echo "登录失败!"
fi
 #!/bin/bash
#my_04.sh read -p "please input your score:" score if [ $score -gt ]
then
echo "优秀!"
elif [ $score -gt -a $score -le ]
then
echo "良好!"
else
echo "一般!"
fi
 #!/bin/bash
#my_05.sh read -p "please input your score:" score
#如果使用(())的话,只能用< > >= <=
if (( $score > ))
then
echo "优秀!"
elif [[ $score -gt && $score -le ]]
then
echo "良好!"
else
echo "一般!"
fi

  测试用户输入的文件名是目录还是文件:

 #!/bin/bash
#my_06.sh read -p "请输入一个目录或者文件名:" name
if [ -z $name ]
then
echo "你输入的信息为空!"
else
if [ -f $name ]
then
echo "这是一个文件!"
elif [ -d $name ]
then
echo "这是一个目录!"
else
echo "不存在这样一个目录或者文件!"
fi
fi

  这三个例子都是关于if条件判断的用法。条件有这么几种写法:[ 条件 ]、test 条件、[[ 条件 ]]、(( 条件 )),用的最多的是第一种。常用判断符号如下

①、逻辑运算符

  -a  expr1 -a expr2  逻辑与

  -o  expr1 -o expr2  逻辑或

  !  !expr1      逻辑非

②、数值判断

  -eq  num1 -eq num2  是否相等

  -ne  num1 -ne num2  是否不相等

  -gt  num1 -gt num2  是否大于

  -ge  num1 -ge num2  是否大于等于

  -lt  num1 -lt num2  是否小于

  -le  num1 -le num2  是否小于等于

③、字符串判断

  =  str1 = str2  字符串是否相等

  !=  str1 != str2  字符串是否不等

  -n  -n str1    字符串长度是否不等于0

  -z  -z str2    字符串长度是否等于0

④、文件判断

  -r  -r filename  文件是否存在且可读

  -w  -w filename  文件是否存在且可写

  -s  -s filename  文件是否存在且长度非0

  -f  -f filename  文件是否存在且是普通文件

  -d  -d filename  文件是否存在且是一个目录

  在使用条件判断的时候一定要注意空格,如if [ $name = "liuling" -a $passwd = "lz19921009" ],[]里面前后要有一个空格,所有的判断符号以及逻辑运算符号前后都要有空格,否则会报错。使用[[ 条件 ]]的时候只能使用"&&"符号作为逻辑与来代替"-a",如果使用(( 条件 ))的话,只能用< > >= <=符号,而不能使用“-eq”等符号。

二、case的用法

  这里的case优点类似于java中的swith case

case语法如下:

case var in
pattern )
执行语句1
;;
pattern )
执行语句2
;;
pattern )
执行语句3
;;
*)
执行语句4
;;
esac

注意:*)指匹配其他任意字符串
         每种情况都以;;结束

下面是几个case用法的例子

  1.模拟菜单的选择

 #!/bin/bash
#my_07.sh echo "1 - 普通显示"
echo "2 - 详细显示"
echo "3 - 显示隐藏文件"
echo "4 - 推出" read -p "请选择操作号:" num
case $num in
)
ls ;;
)
ls -l ;;
)
ls -al ;;
)
exit ;;
*)
echo "请输入正确的操作(1--4)"
exit ;;
esac

三、循环语句的使用

1、for循环

for 变量名 in 取值列表
do
命令序列
done

下面是for循环使用的小例子:

 #!/bin/bash
#my_08.sh for a in `seq `
do
echo $a
done
echo "-------------------"
for ((i=;i<=;i++))
do
echo $i
done

  这里第四行使用了`seq 1 3 10`,``是反引号,也就是键盘上Esc下面的一个键,``里面可以写执行命令,把执行后的结果返回。

  seq命令是指序列,seq start size max,start是起始,size是步长,max就是限制的数,比如seq 1 3 10,则返回的是1 4 7 10。

  第9行代码也有点特别,有点像java里面的for循环,不过是双重小括号,在shell中这样也是可以的。

  下面是一个统计文件数目的小程序:

 #!/bin/bash
#my_09.sh i=
for name1 in `ls /etc`
do
# i=`expr $i + `
# let i++
# i=$[$i + ]
# i=$(($i + ))
((i++)) done
echo "文件总数为:$i"

  注:7、8、9、10、11行是数字自增的不同写法,都可以。

2、while循环

while 条件
do
命令序列
done

下面是一个录入客户资料的shell脚本:

 #!/bin/bash
#my_10.sh while true
do
echo "登记客户资料(c继续,q退出):"
read choice case $choice in
c)
echo "请输入客户名字:"
read name1
echo "请输入客户年龄:"
read age1
echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt
;;
q)
exit
;;
esac
done

注:
>>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。

>> 和 > 区别

>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。

>customer.txt 就会重新写入, 覆盖原有的数据

四、函数的应用

function 函数名(){

}
or
函数名(){ } 函数调用:
函数名
函数名 参数1 参数2

下面是一个小例子程序:

 #!/bin/bash
#fun.sh
function add(){
echo $(($+$))
}
add
add

  

shell语法使用的更多相关文章

  1. makefile中的shell语法

    在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...

  2. Hadoop学习笔记之HBase Shell语法练习

    Hadoop学习笔记之HBase Shell语法练习 作者:hugengyong 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令 ...

  3. Shell语法规范

    ver:1.0 博客:https://www.cnblogs.com/Rohn 本文介绍了Shell编程的一些语法规范,主要参考依据为谷歌的Shell语法风格. 目录 背景 使用哪一种Shell 什么 ...

  4. shell语法习题练习进阶版

    第4章 shell语法深度习题练习 4.1 使用if,case,函数的方法将服务改成system(centos6) 4.1.1 if方法 4.1.1.1 system实现 4.1.1.1.1 编写代码 ...

  5. 读完学会shell语法,shell脚本80%已经学会

    第3章 shell语法讲解 3.1 shell运算讲解 3.1.1 运算符的讲解 3.1.2 shell运算方式的讲解 3.1.2.1 $(())运算 [root@m01 test_init] # a ...

  6. shell语法

    基本语法列表 #linux组成:内核+工具 #linux启动: . getty:提示登录名和密码,输入之后调用login . login:login验证用户名和密码,然后调用shell . shell ...

  7. Shell 语法 if 、 case 、for 、 while、 until 、select 、repeat、子函数

    if语法 :   if [ expression ]    then   commandselif [ expression2 ]   then   commandselse   commandsfi ...

  8. Shell 语法之结构化命令(流程控制)

    许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...

  9. shell语法快速入门(1)

    #得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...

  10. shell语法基础

    一.变量 1.linux大小写敏感,变量取名要注意大小写.可以通过变量名前面加$来访问变量的内容.可以通过使用read命令来将用户输入的值赋给一个变量. 2.给变量赋值时,如果字符串中包含空格,就必须 ...

随机推荐

  1. ibatis.net:第三天,Insert

    手工生成主键的模型 xml 配置 <insert id="InsertUser" parameterClass="User"> INSERT INT ...

  2. 重载hash与isEqual:方法

    重载hash与isEqual:方法 前言 NSObject 自带了hash与isEqual:方法,服务于具有hash表结构的数据结构.NSObject自带的hash函数相当于hash表中的f(key) ...

  3. Eclipse中输入变量会自动补全上屏的解决方法

    我自己在启动Eclipse代码补全后输入感觉确实爽多了,但是每次输入变量后一按下空格,编译器会自己帮你写一个很蛋疼的名字,比如你输入了:String mStr后按下空格,它就变成了mString,十分 ...

  4. Visual Studio 2008 安装失败(“Web 创作组件”无法安装)(转)

    今天安装VS2008时出现了问题,怎么都无法安装成功.装了好几次都在“Visual Studio Web 创作组件(Visual Studio Authoring Component)”的安装的时候失 ...

  5. TCP UDP Socket 即时通讯 API 示例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. win7系统不能用telnet命令的两种解决方法

    电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...

  7. C# XmlTextWriter和XmlTextReader 读写XML文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  8. 用php实现交互式工具——How do I write a command-line interactive PHP script?

    I want to write a PHP script that I can use from the command line. I want it to prompt and accept in ...

  9. OnBecameVisible和OnBecameInvisible ,OnWillRenderObject

    OnBecameVisible 和 OnBecameInvisible ,OnWillRenderObject 只有在所挂物体(不包括子物体)有render才有效 //可见 private void ...

  10. CreateFont函数为什么改变不了字体?该怎么解决

    CreateFont函数为什么改变不了字体?CFont   *   f;             f   =   new   CFont;             f-> CreateFont( ...