shell脚本初学者笔记

概述

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

Linux 的 Shell 种类众多,其中Bourne Again Shell(Bash),由于易用和免费,在日常工作中被广泛使用,同时也是大多数Linux 系统默认的 Shell。

基础

 #!/bin/bash #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

新建一个文件*.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

查看当前系统中可以shell程序:cat /etc/shells

查看当前系统中Shell程序的pid:$$

查看当前系统中Shell程序:$SHELL

运行 Shell 脚本有两种方法:1、chmod +x ./test.sh   ./test.sh 2、/bin/bash test.sh

变量

定义变量:YOURPATH=””, 变量名和等号之间不能有空格

使用变量:$ YOURPATH${YOURPATH}

变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。

推荐给所有变量加上花括号,这是个好的编程习惯。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

如:myUrl=http://www.google.com   readonly myUrl

使用 unset 命令可以删除变量,变量被删除后不能再次使用。

unset 命令不能删除只读变量。

运行shell时,会同时存在三种变量:1) 局部变量 2) 环境变量 3) shell变量

获取变量字符串长度:string="abcd"  echo ${#string}  #输出 4

提取子字符串:string="runoob"   echo ${string:1:4}   #输出 unoo

定义数组:array_name=(value0 value1 value2 value3)

读取数组:valuen=${array_name[n]}

获取数组的长度:length=${#array_name[@或*]}

反引号[`]用于命令替换,如`pwd`将pwd命令的输出展开使用

包含外部脚本:. 空格 *.sh

以 # 开头的行就是注释,会被解释器忽略。

多行注释还可以使用以下格式:

:<<EOF               EOF

:<<'                     '

:<<!                      !

Shell 传递参数

$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

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

$*    以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

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

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

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$-    显示Shell使用的当前选项,与set命令功能相同。

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

各种运算符

Shell 和其他编程语言一样,支持多种运算符,包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

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

val=`expr 2 + 2`
echo "两数之和为 : $val"

-eq  检测两个数是否相等,相等返回 true。  

-ne  检测两个数是否不相等,不相等返回 true。  

-gt   检测左边的数是否大于右边的,如果是,则返回 true。     

-lt    检测左边的数是否小于右边的,如果是,则返回 true。     

-ge  检测左边的数是否大于等于右边的,如果是,则返回 true。     

-le   检测左边的数是否小于等于右边的,如果是,则返回 true。     

!      非运算,表达式为 true 则返回 false,否则返回 true。     

-o    或运算,有一个表达式为 true 则返回 true。

-a    与运算,两个表达式都为 true 才返回 true。

&&  逻辑的 AND 

||      逻辑的 OR   

=     检测两个字符串是否相等,相等返回 true。

!=    检测两个字符串是否相等,不相等返回 true。     

-z    检测字符串长度是否为0,为0返回 true。   

-n    检测字符串长度是否为0,不为0返回 true。      

$      检测字符串是否为空,不为空返回 true。

-b file     检测文件是否是块设备文件,如果是,则返回 true。  

-c file      检测文件是否是字符设备文件,如果是,则返回 true。     

-d file     检测文件是否是目录,如果是,则返回 true。     

-f file      检测文件是否是普通文件(不是目录,也不是设备文件),Yes,则返回 true。      -g file     检测文件是否设置了 SGID 位,如果是,则返回 true。     

-k file      检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

-p file     检测文件是否是有名管道,如果是,则返回 true。     

-u file     检测文件是否设置了 SUID 位,如果是,则返回 true。     

-r file      检测文件是否可读,如果是,则返回 true。  

-w file     检测文件是否可写,如果是,则返回 true。

-x file      检测文件是否可执行,如果是,则返回 true。     

-s file      检测文件是否为空(文件大小是否大于0),不为空返回 true。

-e file      检测文件(包括目录)是否存在,如果是,则返回 true。  

输出

Shell 的 echo 指令常用,都是用于字符串的输出。

echo "It is a test"

echo ""It is a test""

echo "$name It is a test"

echo -e "OK! "                        # -e 开启转义

echo -e "OK! c"                        # -e 开启转义 c 不换行

echo "It is a test" > myfile           # 显示结果定向至文件

echo `date`                                 # 显示命令执行结果

printf 命令模仿 C 程序库(library)里的 printf() 程序。

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf "%-10s %-8s %-4s " 姓名 性别 体重kg 

printf "%-10s %-8s %-4.2f " 郭靖 男 66.1234

printf "%-10s %-8s %-4.2f " 杨过 男 48.6543

printf "%-10s %-8s %-4.2f " 郭芙 女 47.9876

流程控制

if condition1

then

    command1

elif condition2

then

    command2

else

    commandN

fi

 

for var in item1 item2 ... itemN

do

    command1

    command2

    ...

    commandN

done

 

while condition

do

    command

done

 

until condition

do

    command

done

 

casein

模式1)

    command1

    command2

    ...

    commandN

    ;;

模式2)

    command1

    command2

    ...

    commandN

    ;;

Esac

可以使用break跳出循环,使用continue继续下一次循环

函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

demoFun(){

    echo "这是我的第一个 shell 函数!"

}

echo "-----函数开始执行-----"

demoFun

echo "-----函数执行完毕-----"

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

 

重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端

command > file    将输出重定向到 file。

command < file    将输入重定向到 file。

command >> file  将输出以追加的方式重定向到 file。

n > file    将文件描述符为 n 的文件重定向到 file。

n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。

n >& m  将输出文件 m 和 n 合并。

n <& m  将输入文件 m 和 n 合并。

<< tag    将开始标记 tag 和结束标记 tag 之间的内容作为输入。

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

总结

Shell脚本需要多多实战练习,可以实现众多复杂的功能,提高办事效率。

参考

https://www.runoob.com/linux/linux-shell.html

https://devhints.io/bash

原文地址:https://www.cnblogs.com/MakeView660/p/11466635.html