使用Shell笔记总结

Posted 七妹要奈斯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Shell笔记总结相关的知识,希望对你有一定的参考价值。

一、变量

1、定义变量不加$符号,使用变量要用$等号两边不能直接接空格符;通常大写字符为系统默认变量,自行设定变量可以使用小写字符。

2、双引号内的特殊字符如 $ 等,可以保有其符号代表的特性,即可以有变量、转移字符;单引号内的特殊字符则只会原样输出。

NAME=yanzu;your_name="wu$NAME";echo $your_name         # wuyanzu
NAME=tingfeng;your_name='xie$NAME';echo $your_name     # xie$NAME

3、在一串指令的执行中,还需要藉由其他额外的指令所提供的信息时,可以使用反单引号 `指令`$(指令)

# uname -r 作为系统命令,并执行其内容
version=$(uname -r);echo $version
version=`uname -r`;echo $version

4、欲为扩增变量内容时,则可用 "$变量名称"$变量 累加内容。

PATH="$PATH":/home/bin      # 字符串就是这样拼接的
PATH=$PATH:/home/bin

5、若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量。

export PATH
env 			# 可查看环境变量

6、使用readonly可以将变量定义为只读变量,只读变量就是一个常量。unset 命令可以删除变量,变量被删除后不能再次使用,不能删除只读变量。

name="wuyanzu"
readonly name	# 指定name为只读变量
age=13
unset age 		# 后面不能再使用age

7、预设变量,开始执行Script脚本时就会设定,且不能被修改。

$#	#传递到脚本的参数的数量
$*	#表示所有位置参数的内容,即以一个字符串显示所有向脚本传递的参数;$* 以"$1 $2 … $n"的形式输出所有参数
$@	#与$*相同,$@以"$1 $2 … $n"的形式输出所有参数
$$	#当前进程的进程号PID
$?	#上个执行指令的回传值;用于检查上一条指令执行是否正确(linux执行返回的状态值:0表示没有错误,其他任何值表明有错误)
$!	#后台运行的最后一个进程的进程号pid

二、字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。 字符串常用操作:拼接、获取长度、提取/替换子串、查找字符。

#!/bin/bash
your_name="wuyanzu"

# 单引号拼接
echo 'hello, '$your_name        #hello, wuyanzu
echo 'hello, '$your_name      #hello, wuyanzu

# 双引号拼接,除单引号方式外加以下方式
echo "hello, $your_name"        #hello, wuyanzu
echo "hello, $your_name"      #hello, wuyanzu

# 获取长度
echo $#your_name              #7
expr length $your_name

# 查找字符位置
expr index $your_name u         #查找u第一次出现的位置,没有就是0,输出:2
expr index $your_name yu        #查找y和u第一次出现的位置,谁先出现算谁,输出:2

# 提取子串
echo $your_name:2     #从索引2开始,至结尾。输出:yanzu
echo $your_name:2:3   #从索引2开始,取3个字符。输出:yan
expr substr $your_name 2 3      #从第二个字符开始,取3个。输出:uya

# 匹配删除子串
echo $your_name#"wu"  #从头开始,匹配最短的wu,将其删除后。输出:yanzu
echo $your_name##"wu" #从头开始,匹配最长的wu,将其删除后。输出:yanzu
echo $your_name%"wu"  #从尾开始,匹配最短的yanzu,将其删除后。输出:wu
echo $your_name%%"wu" #从头开始,匹配最长的yanzu,将其删除后。输出:wu

# 替换子串
echo $your_name/u/o   #使用u替换从头开始第一个匹配的o,输出:woyanzu
echo $your_name//u/o  #使用u替换匹配到的所有o,输出:woyanzo

三、数组

Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开。

#!/bin/bash

# 定义一个数组
your_name=(w u yan "zu")

your_name[4]="!"

# 获取指定元素
echo $your_name[2]    #获取第2个元素,输出:yan

# 获取数组长度
echo $#your_name[*]   # 5
echo $#your_name[*]

# 获取所有元素
echo $your_name[*]    # w u yan zu !
echo $your_name[@]

# 关联数组
declare -A name=(["my_name"]="wuyanzu" ["your_name"]="pengyuyan")
name["his_name"]="panchangjiang"

echo $name["my_name"] # wuyanzu
echo $#name[*]        # 3
echo $name[*]         # pengyuyan wuyanzu panchangjiang

四、基本运算符

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

  • 对于所有的运算符,表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2
  • 条件表达式要放在方括号之间,并且要有空格,例如: [$a == $b]是错误的,必须写成 [ $a == $b ]

4.1 算数、字符串运算符

乘号*前边必须加反斜杠\\才能实现乘法运算。

# 算数运算符
`expr $a + $b`	# a+b
`expr $a - $b`	# a-b
`expr $a \\* $b`	# a*b
`expr $b / $a`	# a/b
`expr $b % $a`	# a%b
a=$b 			# 把变量b的值赋给a
[ $a == $b ]	# a是否等于b
[ $a != $b ]	# a是否等于b

# 字符串运算符
[ $a = $b ]     #检测两个字符串是否相等,相等返回 true
[ $a != $b ]    #检测两个字符串是否不相等,不相等返回 true
[ -z $a ]       #检测字符串长度是否为0,为0返回 true
[ -n "$a" ]     #检测字符串长度是否不为 0,不为 0 返回 true
[ $a ]          #检测字符串是否不为空,不为空返回 true

4.2 关系、布尔、逻辑运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

# 关系运算符
[ $a -eq $b ] #	a == b
[ $a -ne $b ] #	a != b
[ $a -gt $b ] #	a > b
[ $a -lt $b ] #	a < b
[ $a -ge $b ] #	a >= b
[ $a -le $b ] #	a <= b

# 布尔运算符
[ $a -lt 20 -a $b -gt 100 ] # -a:与
[ $a -lt 20 -o $b -gt 100 ] # -o:或
[ ! false ]                 # !:非

# 逻辑运算符
[[ $a -lt 100 && $b -gt 100 ]]	# 逻辑AND
[[ $a -lt 100 || $b -gt 100 ]]	# 逻辑OR

4.3 文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

[ -b $file ]    # 检测文件是否是块设备文件,如果是,则返回 true
[ -c $file ]    # 检测文件是否是字符设备文件,如果是,则返回 true
[ -d $file ]    # 检测文件是否是目录,如果是,则返回 true
[ -f $file ]    # 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 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

4.4 test 命令

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

具体的条件关系、布尔、逻辑、以及文件测试,可参考以上基本运算符。

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo -e "至少有一个文件存在!\\n"    # -e可输出转移字符
else
    echo -e "两个文件都不存在!\\n"
fi

五、控制流

5.1 条件语句

知道if...elif...else的写法,其他的就都会写了。

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

5.2 循环语句

在循环中也可以使用breakcontinue

for var in item1 item2 ... itemN; do command1; command2… done;

while condition
do
    command
done

until condition
do
    command
done

5.3 分支语句

case取值后面必须为单词 in,每一模式必须以右括号结束。

取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
esac

六、函数

定义函数function关键字可选,不带任何参数,所有函数在使用前必须定义。

函数的返回值只能是一个介于 0~255的值,在调用该函数后通过 $? 来获得,参考预设变量

# 函数定义,可以不用function
function demo()
    echo "第一个参数为 $1"
    echo "第二个参数为 $2"
    echo "参数总数有 $# 个"
    echo "作为一个字符串输出所有参数 $*"
    return 8

# 函数调用
demo 1 2 3 4 5 6 7
echo "demo 返回值为 $?"

七、常用命令技巧

7.1 输入/输出重定向

shell课后总结

 

shell课后总结

 

作者:高波

归档:学习笔记

2017年12月4日13:31:08

快捷键:

Ctrl + 1 标题1

Ctrl + 2 标题2

Ctrl + 3 标题3

Ctrl + 4 实例

Ctrl + 5 程序代码

Ctrl + 6 正文

格式说明:

蓝色字体:注释

黄色背景:重要

绿色背景:注意

 

1.1     I

第一章    1

1.1.1 内置命令和一般命令内置命令效率高.    1

1.1.2 yum是python写的默认系统的python是2.7.如果直接下载3.0覆盖会导致yum不能用.    1

1.1.3 shell不同语言的脚本的写法.    1

1.1.4 shell脚本的四种执行方法.    2

1.1.5 sh 执行时新建一个shell窗口(新建一个进程)执行文件中的内容    2

1.1.6 环境变量.    2

1.1.7 定义环境变量的5个文件.    3

1.1.8 环境变量的先后顺序是.    4

1.1.9 系统这么多变量存放在哪里.散落在4个系统文件和/etc/profile.d目录下面    5

 

 

 

 

 

 

第一章

  1. 内置命令和一般命令内置命令效率高.

技术分享图片

内置命令,系统启动就加载.从内存中读取的,速度快,效率高

一般命令需要从硬盘读取,效率低.

 

  1. yum是python写的默认系统的python是2.7.如果直接下载3.0覆盖会导致yum不能用.

需要更换默认路径安装

[[email protected] ~]# which yum

/usr/bin/yum

[[email protected] ~]# file /usr/bin/yum

/usr/bin/yum: Python script, ASCII text executable

 

  1. shell不同语言的脚本的写法.

技术分享图片

 

 

 

 

 

  1. shell脚本的四种执行方法.

第一种:

sh oldboyedu.sh

bash oldboyedu.sh

第二种:

chmod +x ./oldboyedu.sh

 

./oldboyedu.sh

 

第三种执行方法:

cat oldboyedu.sh|bash

 

第四种:

source source是在当前shell中执行一个文件中的命令

. 点 脚本名字.

 

  1. sh 执行时新建一个shell窗口(新建一个进程)执行文件中的内容

 

  1. 环境变量.

技术分享图片

环境变量一般又叫全局变量.

普通变量一般又叫局部变量.

环境变量:在当前shell及所有子shell窗口全局生效.

如果在新开的shell中生效需要写入到配置文件中.

定义环境用export

 

[[email protected] scripts]# aa=oldboy

[[email protected] scripts]# echo $aa

oldboy

[[email protected] scripts]# vim tt.sh

echo $aa

echo $bb

[[email protected] scripts]# sh tt.sh

 

[[email protected] scripts]# source tt.sh

oldboy

 

source把脚本加载到当前脚本中运行.

 

 

  1. 定义环境变量的5个文件.

 

/etc/profile

/etc/bashrc

~/.bashrc

~/.bash_profile

 

/etc/profile.d/

    

  1. 环境变量的先后顺序是.

技术分享图片

 

/etc/profile===>~/.bash_profile====>~/.bashrc=====>/etc/bashrc

 

技术分享图片

技术分享图片

 

技术分享图片

 

 

技术分享图片

 

  1. 系统这么多变量存放在哪里.散落在4个系统文件和/etc/profile.d目录下面

系统变量放在很多地方

 

四个全局变量位置文件里面都有.

技术分享图片

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于使用Shell笔记总结的主要内容,如果未能解决你的问题,请参考以下文章

2018-4-17 Linux学习笔记

Linux 脚本运维总结之Shell script

Linux运维学习第一周总结

Linux学习总结(五十七) shell脚本1

运维笔记:Linux搭建rsync备用服务器,及配置文件详解

Linux运维学习笔记-网络技术知识体系总结