Linux-Shell脚本

1. Shell脚本基础

1.1 脚本编写的基础:

  • 指令的执行时从上而下,从左往右的执行
  • 指令的下达时,指令,选项与参数之间的多个空白都会被忽略掉
  • 空白行业会被忽略,多个[tab]的空白同样视为空格键
  • 读取到一个[Enter](CR),就尝试执行该行(或者该串)命令
  • \[Enter]可以把命令延伸到下一行
  • #可以作为注释

1.2 指令下达的基础:

  • 直接指令下达:shell.sh文件必须要具备可读与可执行(rx)的权限
    • 绝对路径:/home/junzerg/shell.sh
    • 相对路径:./shell.sh
    • 变量PATH:将
  • 以bash程序执行:通过bash shell.sh或者sh shell.sh执行

1.3 hello world

#!/bin/bash
#Program:
#    This program shows "hello world!" on the screen.
#Version
#    0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
echo "hello junzerg!"
exit 0

程序由一下几个部分组成:

  1. #! 指定这个脚本使用的shell名称:本例和大部分情况下使用的是/bin/bash。
  2. 之后#开头的是对文件的注释说明,一般包括内容与功能,版本信息,作者与联系方式,建立日期,历史版本记录
  3. 主要环境变量的声明
  4. 主要程序部分
  5. 执行结果返回

2. 参数

2.1 默认参数

  • #0:代表执行的脚本文件名
  • #1,#2,#3……:代表第n个参数
  • $#:代表后接的参数数量
  • $@:代表所有参数,各参数是独立的(用"包住")
  • $*:代表素有参数,各参数不独立,用""包住,用空格隔开。

2.2 参数偏移

shift命令可以造成参数变量,拿掉前面那个参数。如果加上数字作为参数的话,可以拿掉最前面的n个参数。
例子:

#!/bin/bash
echo "Total parameter number is         ==> $#"
echo "Your whole parameter is           ==> $@"
shift
echo "Total parameter number is         ==> $#"
echo "Yore whole paramter is            ==> $@"
shift
echo "Total parameter number is         ==> $#"
echo "Yore whole paramter is            ==> $@"
shift
echo "Total parameter number is         ==> $#"
echo "Yore whole paramter is            ==> $@"
shift

执行可以看到:

[root@iZwz9ayvrn26ptadymu9ymZ shell]# sh shift_paras.sh one two three four five
Total parameter number is   ==> 5
Your whole parameter is ==> one two three four five
Total parameter number is   ==> 4
Yore whole paramter is  ==> two three four five
Total parameter number is   ==> 3
Yore whole paramter is  ==> three four five
Total parameter number is   ==> 2
Yore whole paramter is  ==> four five

3. 条件判断

3.1 test指令

test指令参数参考:http://man.linuxde.net/test
例子:

!#/bin/bash
#输入文件名,判断使用者是否有输入字符串
echo -e "Please input a filename ,I will check the file's type and permission.\n"
read -p "Input a filename:" filename
test -z ${filename} && echo "You must input a filename." && exit 0
# 判断文件是否存在
test ! -e ${filename} && echo "The filename '${filename}' do not exist" && exit 0
# 判断文件类型与属性
test -f ${filename} && filetype="regulare file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"
echo "The filename:${filename} is a ${filetype}"
echo "And the permissions for you are : ${perm}" 

3.2 判断符号 [ ]

  • 中括号([,])可以用来进行数据的判断。
  • 中括号内两端需要用空格分隔
  • 中括号内的每个组件都需要有空格键来分隔
  • 中括号内的变量,最好都以双引号括起来
  • 中括号内的常量,组好都用单引号或者双引号括起来

例子:

#!/bin/bash
#blah blah
read -p "Please input (Y/N):" yn
[ "${yn}" == "Y" -o "{$yn}" ==  "y" ] && echo "OK, continue!" && exit 0
[ "${yn}" == "N" -o "{$yn}" ==  "n" ] && echo "Oh,interrupt!" && exit 0
echo "I don't konw what your choice is " && exit 0

4. 分支

4.1 if...then

单层,简单条件判断式

if[ 条件判断 ]; then
    当条件成立时,可以进行的工作
fi

在使用中括号作为条件判断时可以:

  • && 表示and,即test命令中的 -a参数
  • || 表示or,即test命令中的-o参数
    例如,一下两个式子是等价的:
[ "${yn}" == "Y" -o "${yn}" == "y"]
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]

多层,复杂判断式

if [ 条件判断式 ]; then
    当条件判断成立时,执行的指令
else
    当条件判断不成立时,执行的指令
fi

更复杂的情况为:

if [ 条件判断式一 ]; then
    当条件判断式一成立时,执行的指令
elif [ 条件判断式二 ]; then
    当条件判断式二成立时,执行的指令
else
    当条件判断式一和二都不成立时,执行的指令
fi

4.2 case ... esac

case $变量名称 in
    "第一个变量内容")
        指令
        ;;
    "第二个变量内容")
        指令
        ;;
    *)
        不包含第一个变量内容和第二个变量内容时执行的指令
        exit 1
        ;;
esac

例如:

#!/bin/bash
#blah blah
case ${1} in
        "a")
                echo "Hello ${1}"
                ;;
        "b")
                echo "${1} Hello"
                ;;
        [0-9])
                echo "Hello number"
                ;;
        *)
                echo "Usage ${0} {hello}"
                ;;
esac

5. 循环

5.1 while do done

当condition条件成立时,就进行循环,直到condition的条件不成立。

while [ condition ]
do
    指令
done

5.2 until do done

当condition条件不成立时,进行循环,直到condition条件成立。

until [ condition ]
do
    指令
done

5.3 for ... do ... done

数组中的循环

for var in con1 con2 con3 ...
do
    指令
done

例子一:

echo -e "Animals:"
for animal in dog cat mouse
do
        echo "There is a ${animal}."
done

运行结果为:

Animals:
There is a dog.
There is a cat.
There is a mouse.

可以使用Linux内建机制处理,例如seq命令和...:

for i in $(seq 1 100)
for i in $(seq a...g)

6. 函数

函数的语法:

function fname() {
    指令
}

注意:

  • 由于shellscript的执行方式是由上而下,因此shell script当中的function的设定一定要在程序的最前面。
  • function也是具有内建变量的,函数明后才能用$0,表示,后续变量也是用$1,$2...取代。

7. shell执行的参数

shell执行可以通过参数的设定来debug

sh [-nvx] scripts.sh
-n  :不要执行script,仅查询语法
-v  :执行script钱,现将script内容输出到屏幕
-x  :   将使用到的script内容显示到屏幕上

推荐阅读更多精彩内容

  • 第1章 小试牛刀 $ 是普通用户,# 表示管理员用户 root。 shebang:#!。sharp / hash ...
    巴喬書摘阅读 3,557评论 1 3
  • 在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${...
    随风化作雨阅读 406评论 0 0
  • Linux的shell脚本是linux的入门基础课程,难度系数也不大,这里做一个学习笔记 ◆1.1 语法基本介绍 ...
    可湿水程序阅读 152评论 0 5
  • 不喜欢把那些人无所谓有的事情放在心上,却偏偏去惦记着。 夏之言——碧波记忆 挺想告诉那个女孩:黎明之夏,很美。我希...
    秋瑾年阅读 40评论 0 0
  • 喜欢不是爱,喜欢是一种感觉,爱是一种感情 不是任何的喜欢都能成为爱,但是所有的爱中都包含着喜欢 现在的我们不是不能...
    郑雪婷阅读 31评论 0 2