Shell 脚本学习笔记-基础

Shell 脚本学习笔记-基础

目录
– 常用符号及含义
– 字符串处理
– 条件判断
– 流程控制
– 函数
– 环境信息相关文件及执行顺序
– 参数处理

常用符号及含义

符号 含义
“” 使 shell 将双引号中的空格、制表符等大多数的特殊字符按普通字符处理。但是有三种特殊字符依然有特殊含义,分别是 &、\和 `
”(单引号) 使 shell 将双引号中得所有字符按普通字符处理
“(反引号) 命令替换。 eg:a=`ls -a`. `ls -a` 的结果会赋值给a。作用同“$()”
\(反斜杠) 转义字符(逃脱字符)使其后的特殊符号作为普通字符处理
; 如果要一行写多个命令,命令之间需要用“;”隔开
;; case 语句中用于表示中断(break)
{} 创建命令块
|(竖杠) 管道标识符。command1 | command2 表示将 command1 的结果作为 command2 的参数。eg: ls -a | grep “filter”
/ 用于目录
$ 放在变量名前面,表示引用变量名对应的值
! 逻辑非
任意一个字符,但不包括 null
* 通配符,表示任意长度的字符,但不包括 null
** 指数。2**3结果是8
#、##、%、%% 用于字符串截取,单符号表示最小匹配,双符号表示最大匹配。键盘上#在$左边,%在$右边,这个规律可以方便记忆
[] 流程控制语句中,扩住判断式。eg:if [ -f filePath ]
# 以 “# ”开头的行为注释
空格、制表符、换行符 作为空白处理

字符串处理

${}

作用 备注
防止混淆 eg:name=”jori”;echo ${name}-ok。当字符串变量和字符串连在一起生成新的字符串的时候区分变量名和字符串
截取功能 定义:file=/dir1/dir2/dir3/test.txt
${file#*/} 输出:dir1/dir2/dir3/test.txt
${file##*/} 输出:test.txt
${file%/*} 输出:/dir1/dir2/dir3
${file%%/*} 输出:(空)
字符串提取 定义:file=/dir1/dir2/dir3/test.txt。格式为:${string:start:count}
${file:1:5} 输出:dir1/
${file:0:5} 输出:/dir1
字符串替换 定义:file=/dir1/dir2/dir3/test.txt。格式为:${string/original/new},${string//original/new}
${file/dir/path} 输出:/path1/dir2/dir3/test.txt
${file//dir/path} 输出:/path1/path2/path3/test.txt
计算字符串变量长度 file=china;echo ${#file}。输出为 5
字符串错误 ${string?message},如果字符串变量存在但是没有赋值,则将message作为错误信息输出;${string:?message}如果字符串变量名没有定义或者没有赋值,则将message作为错误信息输出

条件判断

  • [ ]和[[ ]]的区别在于在[[ ]]中的逻辑判断可以直接使用 ||、&&
  • 下面用到的关键字都为小写
  • [] 这种形式是 test 命令的变形,也可以写成 if test a -nq b,等价于 if [ a -nq b ]
符号 含义
字符串比较
str1 = str2 判断两个字符串是否相等
str1 != str2 两个字符串不等时为真
-n str1 str1长度大于0时为真
-z str1 str1长度为0时为真
数值比较
int1 -eq int2 相等为真
int1 -ne int2 不相等为真
int1 -gt int2 int1 > int2 为真(great than)
int1 -ge int2 int1 >= int2 为真(great or equal)
int1 -lt int2 int1 < int2 为真(less than)
int1 -le int2 int1 <= int2 为真(less or equal)
文件判断
-e file 文件存在为真(exist)
-d file 文件存在并且是一个目录为真(dictionary)
-r file 文件存在并且可读为真(readable)
-w file 文件存在并且可写为真(writable)
-x file 文件存在并且可执行为真(executable)
file1 -nt file2 file1比file2新为真(new than)
file1 -ot file2 file1比file2旧为真(older than)
file1 -ef file2 file1和file2是同一个文件为真(equal file)
express1 -a express2 两个表达式同为真则为真(and)(&&)
express1 -o express2 至少有一个真则为真(or)(||)

更多资料

流程控制

if

if [ logic1 ];then
    //someting to do
else if [ logic2 ]
    //someting to do
else
    //someting to do
fi

for

1.
for arg in aSet;do
    //something to do
done
2.
for (( i=start; i<end; i++ ));do
    //something to do
done

while

while [ logic ];do
    //something to do
done

case

case word in
    pattern1 )
        //something to do
        ;;
    pattern2 )
        //something to do
        ;;
    * )
        //something to do
        ;;
esac

在case语句中pattern如果表示为[Yy]表示如果word为Y或者y则进入这个case,即单字符匹配

Tips:
如果在执行过程中需要以新的参数重新运行脚本,可以使用“$0 param”的方式

函数

shell 自定义函数可以看成自定义了一个新的命令,这个命令的作用范围为定义开始至脚本结束。
所以运行函数的时候可以像命令一样传入参数:Function param1 param2 …
对于参数的处理可以使用$1,$2,$@等系统定义获取参数和参数相关信息。

格式:

[function] name()
{
    //method
}

参数

对于参数的处理可以使用$1,$2,$@等系统定义获取参数和参数相关信息。

关键词

关键词 含义
return value 返回函数的运行状态。非必需
local var=something 标志“var”为局部变量。仅可在函数内部使用
echo 函数中返回值到运行该函数的位置

返回值

在函数中使用“echo”可以返回值到调用该函数的地方。

脚本中使用“exit value”可以退出当前脚本(或者等执行完自动结束),在函数中可以使用“return value”方式结束一个函数(或者函数执行完自动结束),“return value”来返回函数的执行状态,返回的“value”可以通过”$?“来获取。“value”的范围为:0-255

#!/bin/sh
testFunc()
{
    echo "112233"
    return 200
}

case $1 in
    "--start" )
        result=$(testFunc);
        echo "returnCode=$?"
        echo "result=$result"
        ;;
    * )
        echo "param error"
        ;;
esac

结果输出:
returnCode=200
result=112233

调用其他 shell 脚本中的函数

使用其他脚本中的函数需要首先引入这个脚本,然后就可以直接调用对应脚本的函数。

引入其他脚本的方式有三种:
1. path
2. source path
3. sh $path

注意:当引入的脚本中有同名函数时,后引入的会覆盖先引入的

环境信息相关文件及执行顺序

profile

路径:/etc/profile
这个文件为系统中的每个用户设置环境信息,当用户第一次登陆时会执行这个文件。并从/etc/profile.d目录的配置文件中搜集shell设置信息。
如果这个文件内容发生更改,需要重启设置才会生效。这个文件中的设置对所有用户生效

注意:这个文件中设定的变量作用于所有用户

bashrc

路径:/etc/bashrc
为每个运行bash shell的用户执行此文件。用户每次打开bash shell都会执行这个文件。
这个文件被修改后,需要退出bash重新打开才会生效。也可以使用“source /etc/bashrc”的方式重新加载设置信息

.bash_profile

路径:~/.bash_profile
每个用户可以在这个文件设置自己需要的shell信息。这个文件只会在当前用户登陆时读取一次
同profile一样,.bash_profile文件修改后需要重启才会生效。

.profile

路径:~/.profile

Linux的Shell种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)等等。

bash(Bourne Shell)由于免费易用所以被广泛的使用。并且bash是Linux默认的shell。
一般人们不会可以区分Bourne Shell和Bourne Again Shell。所以#!/bin/sh可以改成#!/bin/bash。说以有时会用.profile代替.bash_profile来兼容不同的shell。
.profile(Bourne Shll)和.login(C Shell)是.bash_profile的同义词,目的是为了兼容不同的shell。

.bashrc

路径:~/.bashrc
这个文件包含专用于当前用户bash shell的bash信息。每次登陆和打开新的shell的时候就会读取这个文件。
当这个文件发生变化时,只要重启bash就可生效。也可以使用“source ~/.bashrc”的方式重新加载设置信息
.bashrc中的变量可以继承profile中得变量。profile和.bashrc是“父子”关系

.bash_logout

路径:~/.bash_logout
每次推出bash shell的时候就会执行这个文件

系统变量

符号 意义
$@ 获取所有参数形成一个集合,可以使用 forin 进行遍历
$* 将所有参数拼成一个字符串返回
$# 获取输入参数的数量
$0 获取脚本文件的绝对路径
$1 获取输入的第一个参数
$2 获取输入的第二个参数,依次类推
$$ 获取运行当前脚本的进程ID
$? 获取脚本的运行状态或者上次脚本的推出状态。在运行过程中可以通过$?判断是否之前的命令成功运行
IFS IFS(Internal Field Seprator) ,内部域分隔符。传送门

更多文章

  • shell中${}的妙用
  • Shell 入门基本知识
  • shell脚本中一些特殊符号
  • Linux中profile、bashrc、~/.bash_profile、~/.bashrc、~/.bash_profile之间的区别和联系以及执行顺序
  • profile、environment和bashrc的区别
  • shell中条件判断语法与判断条件小结
  • shell编程之if判断的总结
  • shell学习基础第十九篇-shell函数

你可能感兴趣的:(脚本,shell,脚本)