zoukankan      html  css  js  c++  java
  • [shell]shell脚本的基本语法

    基本格式

    Shell脚本的扩展名为.sh,通常格式如下

    #!/bin/bash
    (其他语句)
    

    第一句话#!/bin/bash是必然的.

    在编写完Shell脚本之后,我们可以输入./xxx.sh来执行.

    但是你会发现你实际上执行不了,因为你没有执行的权限.用ls -l xxx.sh命令,你可以看到权限是-rw-rw-rw-.

    这时可以使用chmod命令来改变权限,例如chmod 777 xxx.sh(chmod相关内容自行了解).

    变量

    shell脚本中的变量在定义的时候可以直接用一个名字,但是在使用的时候需要在前面加一个$号.

    注意是$变量名而不是$(变量名),这个和makefile不一样.

    同时,变量在赋值的时候不能在=的两端加空格.你需要a=1而不是a = 1.

    但是$0,$1...$n这些变量是钦定的,他们是你调用脚本时在命令行输入的参数.其中$0是脚本的名称(有点像C语言).

    $#也是钦定的,他是参数的数量.

    $@也是钦定的,他是所有参数,写了这个相当于写了$0,$1,...$n,例子:

    #!/bin/bash
    echo "num of arguements is :" $#
    echo "first arguement is :" $1
    echo "all argument is :" $@ 
    

    这个代码会输出参数的个数,第一个参数(不算$0),以及列出所有参数.

    表达式

    shell脚本支持整数运算,表达式的格式是$((表达式)).例如

    a=1
    b=2
    c=$(($a+$b))
    

    没错,在这个表达式里面的变量还是要加$.

    交互

    输出

    Shell的输出使用echo命令,如下(他会换行)

    echo "hello world"
    

    输入

    Shell的输入使用read命令,你可以同时输入多个变量,例如

    read a b c
    

    注意,不用加,,一个空格隔开就行.

    你也可以在输入的时候,使用-p选项输出一些提示信息,例如

    read -p "wdnmd" a
    

    你就会看到这样的效果:

    wdnmd<等待输入>
    

    条件判断

    中括号

    你可以使用[ 命题 ]来做一个判断,如果命题是真就会返回真,否则返回假,例如[ $a == 1 ]

    注意[ 命题 ],命题左右这两个奇怪的空格是不能省略的.

    如果命题里面有字符串变量,那么就要在变量两边加双引号,例如[ "$string1" == "asd" ]

    短路和断路

    类似C语言,语句1||语句2这样形式的代码,如果语句1返回结果为真,语句2就不会被执行.如果语句1返回假,那么语句2就会被执行.

    同样的,语句1&&语句2这样形式的代码,如果语句1返回结果为假,语句2就不会被执行.如果语句1返回真,那么语句2就会被执行.

    你骚一点的话,可以用这个特性来实现if else.比如这样,判断输入的数字是不是1.

    #!/bin/bash
    read -p "please input a integer 1: " a
    [ $a == 1 ] && echo "a is 1" || echo "a is not 1"
    

    再比如这样,判断输入的字符串是否一致:

    #!/bin/bash
    echo "please input two string"
    read -p "first string: " firststr
    read -p "second string: " secondstr
    [ "$firststr" == "$secondstr" ] && echo "equal" || echo "not equal"
    

    if语句

    不骚的操作是怎么样的.

    尝龟的写法如下:

    if [ 命题 ]; then
    	语句块1
    elif [ 命题 ];then
    	语句块2
    else
    	语句块3
    fi
    

    你没有看错,就是这么奇怪,[ 命题 ]后面要加一个;,结尾就是fi.当然elif是可选的,就像其他语言一样.

    例如,判断用户输入的是yes还是no还是其他的什么玩意.可以这样写:

    #!/bin/bash
    read -p "please input yes or no: " value
    
    if [ "$value" == "yes" ]; then
    	echo "your input string is yes"
    elif [ "$value" == "no" ]; then
    	echo "your input string is no"
    else 
    	echo "your input string is unknow"
    fi
    

    case语句

    通常写法如下:

    case $a in
    	值1)
    		语句块
    		;;
    	值2)
    		语句块
    		;;
    		
    esac
    

    你还是没有看错,他又是奇怪地在语句块后面加两个分号,奇怪地在值后面加一个括号.

    你应该看出来了,这个结束的关键字就是case倒过来写.

    如果是字符串,值应该加个双引号.

    例如,你要判断输入的数字是不是1或者2或者其他什么玩意:

    
    #!/bin/bash
    read a
    
    case $a in
    	1)
    		echo "apple"
    		;;
    	
    	2)
    		echo "banana"
    		;;
    	*)
    		echo "unknown"
    		;;
    esac
    

    再例如,你要判断第一个命令行参数是不是a或者b或者其他什么玩意:

    #!/bin/bash
    
    case $1 in
    	"a")
    		echo "apple"
    		;;
    	
    	"b")
    		echo "banana"
    		;;
    	*)
    		echo "unknown"
    		;;
    esac
    

    你应该发现了,*是什么玩意?

    他其实是一个通配符,前面都不符合就会落在他的手上.注意,就算变量是字符串,你也不应该给他加上双引号.

    循环

    第一种for循环

    for 循环变量 in 值1 值2 ... 值n
    do
    	语句
    done
    

    这样的话,循环变量会依次被赋值成对应循环次数的值,然后执行循环,直到遍历完所有值.

    有点像其他语言的foreach.例如,用循环输出所有命令行参数(你应该还记得$@是什么东西吧):

    #!/bin/bash
    
    for var in $@
    do
    	echo "var is $var"
    done
    
    echo "for stop"
    

    第二种for循环

    这是世俗眼光里的for循环.

    for ((循环变量=0; 循环变量<=限制; 循环变量=下一次的循环变量))
    do
    	语句
    while
    

    又变得奇怪了,这里要加两个括号的.

    例如这样,计算1到n之间每个数字的和:

    #!/bin/bash
    
    read -p "please input the n:" n
    s=0
    for ((i=0; i<=n; i=i+1))
    do
    	s=$(($s+$i))
    done
    
    echo "1+2+3...+$n=$s"
    

    函数

    没有参数的时候

    函数可以写成这样

    function 函数名称(){
    	语句块
    }
    

    你也可以省略function,直接写成

    函数名称(){
    
    }
    

    例如,我们通过第一个命令行参数来调用函数:

    #!/bin/bash
    
    function help(){
    	echo "this is first function."
    }
    
    function close(){
    	echo "this is second function."
    }
    
    case $1 in
    	"-1")
    		help
    		;;
    	"-2")
    		close
    		;;
    	*)
    		echo "nothing happen"
    		;;
    esac
    

    没错,调用的时候只要写函数名称,而不是函数名称().

    那就离谱了,参数要写在哪里?

    有参数的时候

    给函数传参数的方法有点像命令行给程序传参数:

    函数名称 参数1 参数2 ... 参数n
    

    那么函数怎么拿到参数?

    方法和拿命令行参数一样,例如:

    function 函数名称(){
    	echo $1
    }
    

    例如,我们用一个函数来计算1-n之间的数字的和:

    #!/bin/bash
    
    function getsum(){
    	s=0
    	for ((i=0; i<=$1; i=i+1))
    	do
    		s=$(($s+$i))
    	done
    
    	echo "1+2+3...+$1=$s"
    }
    
    read -p "please input the num: " n
    getsum n
    

    你学会了

    你学会了吗,学会了请把学会了打在公屏上.

  • 相关阅读:
    网络攻防第十一周作业
    网络攻防第十周作业
    网络攻防第九周作业
    网络攻防第八周作业
    网络攻防第七周作业
    网络攻防第六周作业
    网络攻防第五周作业
    网络攻防第四周作业
    网络攻防第三周作业
    20189207《网络攻防实践》第十一周作业
  • 原文地址:https://www.cnblogs.com/zzidun-pavo/p/14418693.html
Copyright © 2011-2022 走看看