系统相关
首页 > 系统相关> > Shell | Shell 编程基础(三)

Shell | Shell 编程基础(三)

作者:互联网

Shell | Shell 编程基础(三)


一、编程基础

  1. 解释器:
    Shell脚本第一行指定解释器必须写#!/bin/bash,如果没有会默认使用#!/bin/sh作为解释程序

  2. 注释:
    Shell注释,单行#,多行

    <<COMMENT
    	comment line 1
    	comment line 2
    	comment line n
    COMMENT
    
  3. 设置执行权限
    当前用户增加执行权限 chmod u+x ./脚本名.sh
    所有用户增加执行权限 chmod +x ./脚本名.sh

    将脚本路径添加到环境变量中,可以实现任意位置调用,不用使用全路径

  4. Bash中的参数扩展

    #参数名后面还紧连着其他字符,必须使用{}
    	WORD=car
    	echo ${WORD}s
    	cars
    #对于使用$9之后的参数也需要使用大括号
    	echo "Argument  1 is: $1"
    	echo "Argument 10 is: ${10}"
    #注意:参数名是大小写敏感的
    #间接参数扩展
    ${!PARAMETER}
    #上述语句中,被引用的参数不是PARAMETER自身,而是PARAMETER的值
    #如:数PARAMETER的值是 TEMP ,则${!PARAMETER}将扩展为参数TEMP的值
    	PARAMETER=TEMP
    	TEMP="It's indirect"
    	TEMP="It's indirect"
    	> It s indirect
    #大小写修改(Bash 4.0的新特性):
    	#操作符“^”将参数值的第一个字符改为大写,操作符“,”将参数值的第一个字符改为小写。当使用双重模式(^^和,,)时,参数值的所有字符都将被转换。下面实例中,将当前目录下的所有后缀为txt的文件名转换为小写: 
    	mv "$file" "${file,,}"
    #变量名扩展:
    	${!PREFIX*}
    	${!PREFIX@}
    #这种参数扩展将列出以字符串PREFIX开头的所有变量名。
    
    #字符串移除:
    	${PARAMETER#PATTERN}
    	${PARAMETER##PATTERN}
    	${PARAMETER%PATTERN}
    	${PARAMETER%%PATTERN}
    #上述的语法格式中,前两个语句用于移除从参数值的开头匹配指定模式的字符串,而后两个语句与之相反,用于从参数值的末尾匹配指定模式的字符串。操作符“#”和“%”表示将移除匹配指定模式的最短文本,而操作符“##”和“%%”表示移除匹配指定模式的最长文本。
    #可能这种参数扩展最常用的用途是提取文件名的一部分
    
    #字符串搜索与替换
    	${PARAMETER/PATTERN/STRING}
    	${PARAMETER//PATTERN/STRING}
    	${PARAMETER/PATTERN}
    	${PARAMETER//PATTERN}
    #/表示只替换一个匹配的字符串
    #// 表示替换所有匹配的字符串
    #如果没有指定替换字符串,将被删除
    
    #求字符串长度:
    	${#PARAMETER}
    	MYSTRING="Hello World"
    	echo ${#MYSTRING}
    	> 11
    #子字符串扩展
    	${PARAMETER:OFFSET}
    	${PARAMETER:OFFSET:LENGTH}
    	
    	从指定开始位置截取指定长度字符出啊,省略LENGTH将截取到末尾
    	MYSTRING="This is used for substring expansion."
    	echo ${MYSTRING:8}
    	>used for substring expansion.
    	#指定LENGTH
    	echo ${MYSTRING:8:10}
    	used for s
    #使用默认值
    	${PARAMETER:-WORD}
    	${PARAMETER-WORD}
    #如果参数PARAMAETER未定义或为null时,这种模式会扩展为WORD,否则时参数PARAMAETER
    #如果省略“:”,只有参数时未定义时才会使用WORD
    #指定默认值:
    	${PARAMETER:=WORD}
    	${PARAMETER=WORD}
    #使用替代值:
    	${PARAMETER:+WORD}
    	${PARAMETER+WORD}
    #如果参数PARAMETER是未定义的,或其值为空时,这种模式将不扩展任何内容。如果参数PARAMETER是定义的,且其值不为空,这种模式将扩展WORD,而不是扩展为参数PARAMETER的值。
    
  5. Bash的内部变量

    #一些常见的Bash内部变量
    
    #用于引用Bash实例的全路径
    echo $BASH
    > /bin/bash
    #当前用户的home目录
    echo $BASH
    > /root
    #IFS是内部字段分隔符的缩写。此变量决定当Bash解析字符串时将怎样识别字段,或单词分界线。变量$IFS的默认值是空格(空格、制表符和换行),但可以被修改。请看如下实例:
    set x y z        #使用set命令,将x,y,z赋予位置 参数1,2,3
    IFS=":;-"        #指定Bash的内部字段分隔符
    echo "$*"        #扩展特殊参数*
    x:y:z
    #操作系统的类型
    	echo $OSTYPE
    	linux-gnu
    #$SECONDS变量  脚本已经运行的秒数
    #$TMOUT变量  $TMOUT变量被指定了一个非零的值,此值就会被Bash的内部命令read作为默认的超时秒数
    #$UID变量  当前用户的账号标识码(ID号)只读变量,不允许修改
    

6. Bash中的位置参数和特殊参数

多于一个数字的位置参数在扩展时必须放在大括号中。比如,位置参数10在扩展时使用${10}。

  1. 用declare指定变量的类型
  1. Bash中的数组变量
    #间接声明一个数组变量的语法如下所示:
    ARRAYNAME[INDEX]=value
    #INDEX是一个正数,或是一个值为正数的算术表达式
    #显式声明一个数组变量是使用Bash的内部命令declare
    	declare -a ARRAYNAME
    #数组变量还可以使用复合赋值的格式:
    	ARRAYNAME=(value1 value2 … valueN)
    若要引用数组中某一项的内容,必须要使用花括号“{}”。如果索引编号是“@”或“*”,那么数组的所有成员都将被引用
    	echo ${linux[@]}
    	> Debian Redhat Suse Fedora
    	arr1=(one two three)
    	echo ${arr1[0]} ${arr1[1]} ${arr1[2]}
    使用unset命令可以消除一个数组或数组的成员变量
    	unset arr1[2]
    	echo ${arr1[@]}
    
  2. Bash的算术运算符
  1. 数字常量
  1. 使用算术扩展和let进行算术运算

    算术扩展中的运算数只能是整数,算术扩展不能对浮点数进行算术运算。

    ```
    # 变量允许作为运算数
    var=$(( $var + 8))
    var=$(( var + 8))
    echo $var
    z=$(( x%y ))          #求余运算
    echo $(( 10>3 ))      #符号“>”为比较运算符,运算结果返回1,0
    let "i <<= 3"         #左移3位并赋值
    let "i = i<6 ? i : 6" #问号?前的表达式值为真,取i的值,否则取6
    ```
    
  2. 使用expr命令

二、脚本常识

  1. 退出脚本
  1. 使用exit命令

强烈建议,在你的Shell脚本中对调用的程序进行退出状态检查,并根据退出状态做出相应的处理,当脚本退出运行时,明确地返回一个退出状态码,这对一个完善的Shell脚本来说,是不可或缺的。

  1. 调试脚本

这一调试功能在自3.0以后的Bash大多数现代版本中可用。

```
#Shell脚本中使用“set -x”和“set +x”命令来调试脚本中的某一段代码。
#不确定脚本param_underscore.sh中的“uname -a”命令将做什么操作,我们可以对脚本中的这段内容做类似如下的调整,只调试这段代码:
	set -x
	uname –a
	set +x
#此时,脚本运行后的内容将类似如下所示:
	$ ./param_underscore.sh
	The $_ is ./param_underscore.sh
	+ uname -a
	Linux localhost 2.6.18238.9.1.el5PAE #1 SMP Tue Apr 12 19:28:32 EDT 2011 i686 i686 i386 GNU/Linux
	+ set +x
	+x
```
  1. 本编程风格

标签:脚本,Shell,编程,基础,echo,参数,PARAMETER,Bash
来源: https://www.cnblogs.com/zhy-god/p/16614650.html