Shell笔记

一、shell编程基础

打开文本编辑器(如vim),新建一个文件 test.sh

#!/bin/bash

#! 告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。其后路径便是解释此脚本文件的 Shell 程序。

/bin/sh test.sh

/bin/php test.php

这种方法也可以执行脚本,此时代码第一行则不需要写 #!


Ctrl+L 清屏 ; Ctrl+U 剪切光标前的 ; Ctrl+K 剪切光标后的 ; Ctrl+Y 粘贴剪切的内容

可以用分号分隔毫不相关的命令,实现批处理。

特殊执行方法

通配符:

用来匹配文件名


二、Shell变量

0、<基本说明>

Shell 默认所有变量都是字符串类型。

set -u 设置成“调用未声明变量会报错”    

不加选项的 set 是 “查看(几乎)所有变量”;env 也能看一部分环境变量

$PATH 是路径环境变量,与win不同的是,它以冒号作为分隔。


1、<变量基本操作>

定义变量时,不需要其他声明符号,如:your_name="runoob.com"

    注意,变量名和等号之间不能有空格。

定义用户环境变量时:加一个前缀 export  (区别是在子shell中也可访问到)


使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    echo ${your_name}  其中大括号不是必需的,加了方便区分。


使用 readonly 命令可以将变量定义为只读变量,如:

    your_name="runoob.com"

    readonly your_name

使用 unset 命令可以删除变量,如:unset your_name  

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



2、<变量类型>:

1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。



3、

字符串可以用单引号,也可以用双引号。

单引号字符串的限制:

1) 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

2) 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,将变量作为字符串使用。

双引号字符串的优点:

1) 双引号里可以有变量

2) 双引号里可以出现转义字符

获取字符串长度

string="abcd"

echo ${#string}

字符串分片:(索引从0开始)

echo ${string:1:4}



4、

只支持一位数组,下标从0开始。数组是动态的。

定义方法:数组名 = (值1 值2 ... 值n)

读取方法:${数组名[下标]}    

    * 使用 @ 符号可以获取数组中的所有元素

取得数组元素的个数:length=${#array_name[@]}

    * @可以换成*

取得数组单个元素的长度:lengthn=${#array_name[n]}



5、<注释>:

单行:#

多行:(EOF可换成 ' 或者 !)

:<

注释内容...

EOF


6、<变量测试>:

x=${y-new}    若y不存在,x为new;若y存在,x为y。


三、向shell脚本传参

参数用$数字来访问,如 $1,$2,$3 等。其中:

$0 是文件名;10以上要用大括号,如 ${10}

$* 是所有参数(以单个字符串显示);$@ 也是所有参数(以多个字符显示出来)

$# 是参数个数(不含文件名)

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

$$ 脚本运行的当前进程ID号;$! 后台运行的最后一个进程的ID号

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



四、运算符

1、<数学运算>

方法1:val=$(expr 2 + 2)  

    * 也可以用反引号。

    * 运算符与运算数之间一定要加空格!

    * 乘号前必须加反斜杠才能实现运算,即 \*

 方法2:val=$[a+b] 

 【推荐】方法3:val=$((a+b)) 

方法4: let命令,用于执行一个或多个表达式。如:let int++ ; let c=$a+$b



2、<关系运算>

    * 只能用于数字,不能用于字符串,除非字符串的值为数字。

-eq 是否相等;-ne 是否不等;-gt 是否大于;-lt 是否小于

-ge 是否大于等于;-le 是否小于等于

    * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。 


    * 除此之外,还可以使用test命令!

test $[num1] -eq $[num2] 等价于 [$num1 -eq $num2]



3、<布尔&逻辑运算>

     * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。

! 非运算;-o 或运算,也可写成 ||-a 与运算,也可写成 &&

    * 逻辑运算符必须用两个中括号:

    [[ $a -lt 100 && $b -gt 100 ]] 等同于 [ $a -lt 100 -a $b -gt 100 ]



4、<字符串运算符>

     * 必须放在[ ]中括号中,并且运算符与运算数间也要隔开。

= 是否相等;!= 是否不等;(不用 ==)

-z 长度是否为0;-n 长度是否不为0;$ 是否不为空

    * -n后的必须要加双引号,如 [-n "$a"]

    * [$a] 直接这样写就可以判空。


    * 除此之外,前四个运算也可以换成对应的test指令。



5、<文件测试运算符>

首先定义file="文件路径",然后再进行下面的操作.

必须用方括号。

-d 是否是目录;-f 是否是普通文件;-r/-w/-x 是否可读/可写/可执行

-e 检测文件(包括目录)是否存在

-L 文件是否存在?是否是一个符号链接?



6、

文件测试test指令

    * 另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:

    if test -e ./notFile -o -e ./bash


五、echo命令

echo -e 使得输出语句的转义字符生效

    echo -e "\e[1; 颜色 内容 \e[0m"    带颜色输出

echo -n 不换行输出(也可用转义字符实现echo -e "abc\c"

输出重定向(到文件):

    命令 [&]> myfile

    > 是覆盖 ; >> 是尾增 ; & 使得无论是正确还是错误输出,都能写入文件。

    命令 >>文件1 2>>文件2    正确输出写入文件1,错误输出写入文件2


echo `命令` 可以执行命令,并打印出结果,使用的是反引号。

    也可以是$(命令)


六、printf命令

和C语言一样的用法,只不过不用括号和逗号。

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

倘若格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用:

    printf "%s\n" abc def


七、流程控制

sh的流程控制不可为空,例如C语言中 else{//nothing} 这种。

1、<选择结构>:

sh的选择结构

如果要全部写在一行里(用于命令行):

选择结构在一行中

有时候可以用逻辑运算来实现选择:


2、<循环结构>

sh的for循环

循环结构也可以写成一行,用分号隔开即可。

* items可以为列表或字符串


sh的while循环
while循环示例

循环可用于读取键盘信息。 

例如 while read INPUT; do echo "$INPUT is good!"; done

    可以不断地读取用户的输入,并将输入存入变量INPUT中。

如果想要实现死循环,则while后的条件处填写 "" 或者 " true "


sh的until循环

只要condition还为假,就继续循环,直到为真。

condition通常为条件表达式(用中括号括起来的)


case语句

case语句类似switch语句。

每一模式必须以右括号结束。取值可以为变量或常数或者正则。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

例如:

case实例

并列的条件则以 | 作为分隔:

case实例2

循环控制:break跳出所有循环、continue跳出所在循环。


八、其他函数

1. cut 命令提取文件内容    (分隔符不支持空格)

-c 基本不用

2. read:类似python的 input,形式为 

    read [-n 允许输入的位数] [-s ] -p "message" 变量 ; -s 为隐藏输入的数据

2. read:类似python的 input,形式为 

read [-n 允许输入的位数] [-s ] -p "message" 变量 -s 为隐藏输入的数据

你可能感兴趣的:(Shell笔记)