简单过下bash/sh脚本基本知识吧

1、sh/bash要注意空格的使用

2、

for循环:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

while循环和多选择语句

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
7|8)
echo 'ok'
;;
*) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done

函数定义方法:

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

函数参数:在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

带参数的函数示例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。另外,还有几个特殊字符用来处理参数:

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

-r 是否可读

-x 是否可执行

-w 是否可写

-n str 字符串不为null,长度大于零

-z str 字符串为null,长度为零

-d 存在且是一个目录

-e 文件存在

-f 存在且是一个常规文件,非目录,非特殊类型文件

-s 文件存在且不为空

-O own所属的文件

-G group所属的文件

  • -N file :在上次读取后,文件有改动
  • file1 -nt file2 :file1 比 file2 更新,以最后更新时间为准
  • file1 -ot file2 :file1 比 file2 更旧 ,以最后更新时间为准

 >或者<或者=是用于字符串的比较

整数比较

-gt 大于

-ge 大于等于

-lt 小于

-le 不大于

-eq 等于

-ne 不等于

&& 与

||

$1 第一个变量 $2依次类推

$?上次的执行结果

exit 0、exit 1等,表示程序运行完的执行结果

export 把某个变量变为全局变量

source 或者 . 执行,表示立即生效

符号的用法:

1、`cmd`

2、[]:中括号两边都要有空格

if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
    pathmunge /sbin after
fi

3、{} :{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开

4、() :(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号

5、;

6、''  :里面的变量,不取值   a=2;echo 'shen $a'--->shen $a

7、"" :里面的表里取值  a=2;echo "shen $a"--->shen 2

shell内建命令:

1、unset 命令用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。-f:仅删除函数(function); -v:仅删除变量(variable)。
2、set  命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

字符串提取和替换:  ${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

       第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。        
      第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。
       第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。
       
       第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。

[root@centos ~]# var=/home/centos
[root@centos ~]# echo $var
/home/centos
[root@centos ~]# echo ${var:5}
/centos
[root@centos ~]# echo ${var: -6}
centos
[root@centos ~]# echo ${var:(-6)}
centos
[root@centos ~]# echo ${var:1:4}
home
[root@centos ~]# echo ${var/o/h}
/hhme/centos
[root@centos ~]# echo ${var//o/h}
/hhme/cenths

参考:

1、 http://man.linuxde.net/set
2、http://www.runoob.com/linux/linux-shell-func.html

3、http://blog.csdn.net/taiyang1987912/article/details/39551385

原文地址:https://www.cnblogs.com/shengulong/p/7940265.html