shell脚本

上面我们了解了linux基本命令,现在开始学习shell脚本
首先,shell脚本文件后缀名为‘.sh’
一、变量
变量分为全局环境变量和局部环境变量,系统有一些定义好的全局环境变量。
m_var=abc   #这里定义一个局部变量名为m_var且值为abc,注意定义变量赋值时“=”两边不允许有空格
export m_var #使用export 将m_var局部变量编程全局变量
二、使用变量(引用变量)
echo "$m_var" #输出abc,如果不使用'$',那么将输出m_var字符串
                #当变量名与其他字符串连在一起时,可以按如下方法区分
echo "${m_var}bbbb" #输出abcbbbb,使用{}可以明确变量名的范围
三、命令替换
``: m_var1=`pwd` #将命令pwd命令结果给变量m_var1
$():m_var2=$(pwd) #同上
四、表达式([[表达式]]、[表达式]、((表达式)))
[表达式]:如,
var1=$[1*3] #[]里的表达式很随意,没有对空格有约束[ 1* 3 ]也对。但是用到if-then的test判断里时,就不能随意了,如:
if [ 1*3 ];then  #[ 1*3 ]和[ 0 ]都是非0表达式
    echo "1*3"
fi
#结果输出1*3,在[]用作if-then判断里时,'['后面必须跟一个空格,‘]’前面也必须跟空格,if后也要有空格
[]里的表达式只能是整数

[[ expression ]]:双中括号表达式在单中括号基础上新增一个模式匹配(正则表达式)
如:if [[ $m_var == r* ]] #这里使用“==”,将右边视为模式匹配
    then
        echo "$m_var"
    fi
((expression)):双括号表达式,没有对括号内的表示式有空格约束,它新增很多运算符,如:++,--,>>,<<,&,|,~等等
四、结构化命令
if-then,如下:
if command
then
    command
fi 
也可以写成:
if command; then
    command
fi
当if后面的命令退出状态码为0时,执行then下面的命令。在shell里命令正常执行状态码为0,异常非0

if-then-else,如下:
if command
then 
    command
else
    command
fi

if的嵌套:
if command
then 
    command
else
    if command
    then
        command
    else
        command
    fi
fi
或者
if command
then
    command
elif command
then
    command
elif command
then 
    command
fi
说明一下,
整数比较
[ n1 -eq n2 ] n1与n2是否相等
[ n1 -ge n2 ] n1大于等于n2
[ n1 -gt n2 ] n1大于n2
[ n1 -le n2 ] n1小于等于n2
[ n1 -lt n2 ] n1小于n2
[ n1 -ne n2 ] n1与n2是否不等
字符串比较
[ str1 = str2 ] 
[ str1 != str2 ] 
[ str1 < str2 ] 
[ str1 > str2 ] 
[ -n str1 ] str1长度是否非0
[ -s str1 ] str1长度是否为0
文件比较
[ -d file ] 文件file是否存在并且是目录
[ -e file ] 是否存在
[ -f file ] 是否存在并且是文件
[ -r file ] 是否可读
[ -w file ] 是否可写
[ -x file ] 是否可执行
[ file1 -nt file2 ] file1是否比file2新
[ file1 -ot file2 ] file1是否比file2旧

case命令,如下:
case $var in
rich | barbara)
    command;;
testing)
    command;;
*)
    command;;
esac

for命令,如:
for var in list
do
    command
done
或者有c语言风格的for:
for((i=1;i<=10;i++))
do
    echo $i
done

while命令
while test command
do
    command
done
这里的test command和if-then里的一样,命令退出码为0就执行下面命令,非0就会跳出while了.

提示一下:也有break命令,break表示跳出当前执行的循环体,break n表示跳出n个循环体
continue和c里的一样

until命令
until test command
do 
    command
done
写法和while一样,但是until是与while完全相反,它是命令退出码为0就不执行,非0就进入循环

五、字符串处理
1.字符串替换
例如:
string=abc12342341
echo ${string/23/bb} //abc1bb42341 替换一次
echo ${string//23/bb} //abc1bb4bb41 双斜杠替换所有
echo ${string/#abc/bb} //bb12342341 #以什么开头来匹配
echo ${string/%41/bb} //abc123423bb %以什么结尾来匹配
2.字符串截取
假设变量 var=http://www.aaa.com/123.htm
echo ${var#*//} 
输出:www.aaa.com/123.htm
#表示从左往右删除(删除第一个匹配到的字符),保留右边字符,这里从左往右删除知道遇见第一个//结束

echo ${var##*/}
输出123.htm
##表示从左往右删除(删除最后一个匹配的字符),保留右边字符。

echo ${var%/*}
输出:http://www.aaa.com/123
%表示从右往左删除(删除第一个匹配的字符),保留左边字符

echo ${var%%/*}
输出:http:
%%表示从右往左删除(删除最后一个匹配的字符),保留左边字符

echo ${var:0:5}
输出:http:
这里0表示左边第一个字符,5表示字符个数
${var:7}表示从左边第7个字符开始到结束
${var:0-7}表示从右边第7个字符开始到结束
${var:0-7:3}表示从右边第7个字符开始,字符长度为3

六、shell中$0,$n,$*,$#,$$,$?,$-,$@值
$0这个脚本程序的执行名字(脚本名)
$n这个脚本的第n个参数n为1,2...
$*这个脚本程序的所有参数,但是这些参数为一个字符串
$#这个脚本参数个数
$$这个脚本的PID,进程号
$?执行上一个命令的退出码(最后执行的命令的退出状态,0表示没有问题,非0表示有问题)
$-显示shell使用的当前选项
$@这个脚本的所有参数,与$*不同,它可以作为数组。
另外:shift表示参数移动,shift 2向左移动两个参数
#/bin/bash
count=1
while [ -n $1 ]
do
    echo "parameter $count = $1 "
    count=$[$count+1]
    shift #表示向左移动1个参数
done

七、用户输入
read var #用户输入值给变量var
read -p "Please input name: " name #带提示的输入
read -t 5 -p "please input age: " age #表示在5s内输入,否则read返回一个非0状态码

八、信号捕获
trap command signals
例如:
#/bin/bash
trap "echo 'sorry have a signal'" SIGINT
while [ -n $1 ]
do
    echo "loop $1"
    shift
done
也可以修改异常捕获,如:
#/bin/bash
trap "echo 'sorry have a signal'" SIGINT
while [ -n $1 ]
do
    echo "loop $1"
    shift
done
trap "echo 'modify signal '" SIGINT
for((i=0;i<10;i++))
do
    echo $i
done 
trap -- SIGINT #使用trap -- 表示移除某个异常的捕获,然后脚本程序会直接退出
修改异常捕获后就按照修改后的执行

九、函数
创建函数
function name {
    command
}
如:
#/bin/bash
function func1 {
    echo "this is an example of a function"
}
count=1
while [ $count -le 5 ]
do 
    fun1
        count=$[ $count+1 ]
done
函数退出码
正常执行完退出码为0,否则非0,也可以设置函数退出码
function db1{
    read -p "input int value: " value
    return $value
}
捕获函数退出码,用$?,表示上一个执行命令的退出码,也以表示函数的退出码
向函数传递参数,用$n,可以知道各个参数。
总结:可以将函数看成一个命令就行了

最后说几个命令
外部命令,通常在/bin,/usr/bin中可用which 和type -a 查找命令所在位置
内建命令(作为shell工具的组成部分存在,建于bash shell里),type 可知道命令是否是内建命令
查看环境变量: env printenv
显示某个环境变量的值: printenv HOME或者echo $HOME

你可能感兴趣的:(linux)