Linux系统--脚本Bash

来源:互联网 发布:win7删除u盘linux分区 编辑:程序博客网 时间:2024/05/21 14:58

sh(全称Bourne Shell)、bash(全称Bourne Again Shell)

#!/bin/bash
#! 是一个约定的标记,用来告诉系统该脚本需要什么解释器来执行。


运行脚本

chmod +x ./test.sh  #使脚本具有执行权限./test.sh  #执行脚本
若想执行脚本时,执行 "test.sh",Linux系统会去PATH里寻找该文件。而只有/bin、/sbin、/usr/sbin等在PATH里。"./test.sh"表示当前目录的test.sh文件。

/bin/bash test.sh  #将脚本文件 作为解释器运行的参数/bin/php test.php


定义变量

variable_name="this is a variable"  #定义变量 可多次定义 但必须按第一次定义的格式  注意变量与"="间不能有空格echo $variable_name  #使用已定义的变量echo ${variable_name} # {}可选,主要为了帮助解释器识别变量的边界echo "I am have varaible name ${variable_name}"  #打印输出variable_name
格式:首字符必须为字母、不能使用bash里的关键字(可用help命令查看保留关键字)

注:PHP语言中定义变量需要加 $ 符号

variable="I want readonly variable"readonly variable #只读变量variable_normal="normal variable"unset variable #删除变量,不能删除只读变量


字符串

#字符串可以用单引号,也可以用双引号、也可以不用引号#单引号里的任何字符都会原样输出,即其中的变量是无效的  注:单引号字符中不能出现单引号(转移符在其中失效)#双引号里可以有变量以及转义字符variable_name="student"greeting="hello, "$variable_name" !" #拼接字符串greeting_1="hello, ${variable_name} !" #等同上一句echo ${#greeting} #获取字符串长度echo `expr index "$greeting" na` #查找字符n或a的位置,注意"`"是反引号


数组

array_name=(value0 value1 value2) #括号表示数组,元素用空格符号或换行符隔开array_name1=(value0value1)array_name[0]=value0  #单独定义数组的各个分量array_name[2]=value1  #可以不适用连续的下标,而且下标的范围没有限制${数组名[下标]} #读取数组元素echo ${array_name[@]} #使用@符合获取数组中的所有元素length=${#array_name[@]} #获取数组元素个数length=${#array_name[*]} #获取数组元素个数lengthn=${#array_name[n]} #获取数组单个元素的长度

Bash Shell只支持一维数组


注释:#开头的行就是注释,可以将多段代码用花括号括起来,定义成一个函数,不调用相当于多行注释


字符串截取

echo ${var#*//} #var是变量名, *// 表示从左边开始删除第一个//号及左边的所有字符echo ${var##*/} #  ##*/ 表示从左边开始删除至最右边的一个 / 号  即删除左边字符,保留右边字符echo ${var%/*} #  %/* 表示从右边开始,删除第一个/号及右边的字符echo ${var%%/*} # %%/* 表示从右边开始,删除最左边一个/号及右边的字符echo ${var:0:5} #截取从左边第几个字符开始的几个字符echo ${var:7} #截取 左边7个字符除外的字符echo ${var:0-7:3} #其中0-7表示截取从右边算起第七个字符开始的3个字符echo ${var:0-7} #截取从右边第七个字符开始的所有字符
总结:

#、##表示从左边开始删除。一个#表示从左边删除到第一个指定的字符;两个#表示从左边删除到最后一个指定的字符。

%、%%表示从右边开始删除。一个%表示从右边删除到第一个指定的字符;两个%表示从右边删除到最后一个指定的字符。

删除包括了指定的字符本身。


参数

执行Shell脚本时,向脚本传递参数。脚本内获取参数的格式:$n。$0代表脚本的文件名,$0代表第一个参数

$# 代表传递到脚本的参数个数

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的ID号

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$*  代表以一个单字符串显示所有向脚本传递的参数。"$*"表示以"$1 $2 ... $n"的形式输出所有参数。

$@ 与$*相同。"$@"表示以"$1" "$2".."$n"的形式输出所有参数。

#!/bin/bashfor i in "$*";do   echo $idone# ./test.sh 1 2 3# 输出# 1 2 3for i in "$@";do   echo $idone# 输出# 1# 2# 3

运算符

expr是一款表达式计算工具,使用它就能完成表达式的求值操作。

val=`expr 2 + 2`  # 注意反引号  表达式和运算符之间要有空格echo "两数之和为:$val"a=$b #赋值`expr $a \* $b` #乘法 *前必须加\转义# [ $a == $b ] #是否相等  注意空格,[$a==$b]是错误的# [ $a != $b ]
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
[ $a -eq $b ] #两个数是否相等,相等返回true[ $a -ne $b ] #两个数是否不相等[ $a -gt $b ] # >[ $a -lt $b ] # <[ $a -ge $b ] # >=[ $a -le $b ] # <=[ !false ] # 返回true  非运算[ $a -lt 20 -o $b -gt 100 ] # -o 或运算[ $a -lt 20 -a $b -gt 100 ] # -a 与运算#逻辑运算符[[ $a -lt 20 && $b -gt 100 ]] # 逻辑的AND [[ $a -lt 20 || $b -gt 100 ]]  # 逻辑的OR
#字符串运算符

[ $a = $b ] #检查两个字符串是否相等[ $a != $b ] #检查两个字符串是否不相等[ -z $a ] #检查字符串长度是否为0[ -n $a ] #检查字符串长度是否不为0[ $a ]检测字符串是否为空
#文件测试运算符:用于检查Unix文件的各种属性
[ -b $file ] #检查文件是否是块设备文件[ -c $file ] #检查文件是否是字符设备文件[ -d $file ] #检查文件是否是目录[ -f $file ] #检查文件是否是普通文件(既不是目录,也不是设备文件)[ -g $file ] #检查文件是否是设置SGID位[ -k $file ] #检查文件是否是设置粘着位(Sticky Bit)[ -p $file ] #检查文件是否是有名管道[ -u $file ] #检查文件是否是设置SUID位[ -r $file ] #检查文件是否是可读[ -w $file ] #检查文件是否是可写[ -x $file ] #检查文件是否是可执行[ -s $file ] #检查文件是否是空(文件大小是否大于0)[ -e $file ] #检查文件(包括目录)是否存在


echo命令

echo "It is a test"  #显示普通字符串echo It is a test #省略双引号  效果同上echo "\"It is a test\""  #显示转义字符  输出:"It is a test"

显示换行

echo -e "OK! \n"  # -e开启转义echo -e "OK! \c"  # \c不换行echo "It is a test" > myfile  #显示结果定向至文件echo `data` #显示命令执行结果   显示当前日期

printf命令 模拟C程序库里的printf程序
printf format-string [arguments...]    #format_string格式控制字符串  arguments 参数列表


test命令
用于检查某个条件是否成立,它可以进行数值、字符和文件三方面的测试

num1=100num2=100if test $[num1] -eq $[num2]then   echo "相等"else   echo "不相等"firesult=$[num1+num2] #注意等号两边不能有空格   []执行基本的算数运算str1="str"str2="str"if test $str1 = #str2  #测试字符串是否相等if test -e ./bash  #测试文件是否存在if test -e ./notFile -o -e ./bash  测试是否至少一个文件存在

流程控制
sh的流程控制不可为空,即控制体必须有语句执行

if语句

if conditionthen   command1else   command2fiif condition1then   command1elif condition2then   command2else   command3fi
for循环

for var in item1 itme2 ... itemN  #当变量值在列表中,执行一次所有命令do   commanddonefor var in item item2 ... itmeN; do command;command2;done;#注:in 列表 可以包含替换、字符串和文件名
while循环

int=1while( ( $int<=5 ) )do   echo $int   let "int++"  #Bash let命令,用于执行一个或多个表达式,变量计算中不需要加上$来表示变量done
无限循环

while :do   commmanddone#或 while true 或 for((; ;))
until语句

until conditiondo   commmanddone
case语句
case 值 in   模式1)    command    ;;   #两个 分号表示break   模式2)     command2     ;;esac#注意 case 使用 esac 作为结束标记

跳出循环   break或continue


Shell函数

[ function ] funname [()]{   action;   [return int;] #参数返回,若没有return,则将以最后一条命令运行结果作为返回值。}#注意函数执行 不需要()括号#函数返回值在调用该函数后通过 $? 来获得#函数参数,在函数体内部,通过 $n 的形式来获得参数的值 仅限 1到9#注意,$10 表示第一个参数 + '0' ${10}获得第十个参数# $# 传递到脚本的参数个数

输入/输出重定向

#  command > file  将输出重定向到file#  command < file  将输入重定义到file#  command >> file 将输出以追加的方式重定向到file#  n > file 将文件描述符为n的文件重定向到file#  n >> file #  n >& m 将输出文件m和n合并#  n <& m 将输入文件m和n合并#  << tag 将开始标记tag和结束标记tag之间的内容作为输入
一般情况下,每个Unix/Linux命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。


Here Doucument是Shell中的一种特殊的重定向方式,用于将输入重定向到一个交互式Shell脚本或程序。

# 格式如下command << delimiter   documentdelimiter# 将两个delimiter之间的内容(document)作为输入传递给command# 注意 结尾的delimiter一定要顶格写,前面或后面都不能有任何字符,包括空格和tab缩进#示例$ wc -l << EOF   欢迎来到   CSDNEOF# 输出结果为2行# wc -l 命令计算 Here Document的行数


/dev/null文件:用于执行某个命令,但不希望在屏幕上显示输出结果。方法:将输出重定位到  /dev/null

$ command > /dev/null#/dev/null文件是一个特殊的文件,写入到它的内容都会被丢弃。
屏蔽stdout 和 stderr

$ command > /dev/null 2>&1  #重定向输出到文件,再将stderr重定向到stdout# 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符# 文件描述符为1的文件(即/dev/stdout,stdout在file system中的映射)
顺序问题

xxx > list 2>&1  #第一种xxx 2>&1 > list  #第二种#第一种,先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list#第二种,先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,#依然是对接到stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响。



后续实例更新

原创粉丝点击