Linux shell

目录

一、echo 命令用法

1、echo 颜色输出

二、位置参数

三、if条件判断

1、shell 算数运算符

2、shell关系运算符

3、shell字符串运算符

​​​​4、 shell 文件测试运算符  

 5、shell逻辑运算符     

四、case

五、for循环

六、while 循环

七、shift 

8、select 

9、function 函数

10、expect 

expect 支持变量

shell 数组

获取数组中的所有元素

七、正则表达式匹配简单语法汇总

1、字母:匹配单个字母

2、一组字符:任意匹配里面的一个单个字符

3、边界匹配

4、简写表达式:每一位出现的简写标记也只表示一位

5、数量表示:之前所有的正则都只是表示一位,如果要表示多位,则就需要数量表示。

6、逻辑表示:与、或、非

basename:去掉文件名的路径和后缀 

单引号''和双引号""

反引号``


一、echo 命令用法

1、echo 颜色输出

echo -e "\e[1;31mhello,world.\e[0m"     文字颜色

echo -e "\e[41m \e[0m";  背景色

一、常用选项

echo命令我们经常使用的选项有两个

①-n,表示输出之后不换行。

②-e,表示对于转义字符按对应的方式处理,假设不加-e那么对于转义字符会按普通字符处理。

二、位置参数

shell 脚本中 $$、$#、$? 分别代表什么意思?

$0:这个程式的执行名字。
$n:这个程式的第 n 个参数值,n=1…9。
$*:这个程式的所有参数,此选项参数可超过 9 个。
$#:这个程式的参数个数。
$$:这个程式的 PID(脚本运行的当前进程 ID 号)
$!:执行上一个背景指令的 PID (后台运行的最后一个进程的进程 ID 号)
$?:执行上一个指令的返回值 (显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误)
$-:显示 shell 使用的当前选项,与 set 命令功能相同。
@ 跟 @ 跟@跟*类似,但是可以当作数组

$*:表示将变量看成一个整体
$@:表示变量是独立的

三、if条件判断

if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

Execute commands based on conditional.

The `if COMMANDS' list is executed.  If its exit status is zero, then the `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is executed in turn, and if its exit status is zero, the corresponding `then COMMANDS' list is executed and the if command completes.  Otherwise,the `else COMMANDS' list is executed, if present.  The exit status of the,entire construct is the exit status of the last command executed, or zeroif no condition tested true.

根据条件判断执行命令

执行“if COMMANDS”列表。如果其退出状态为零,则

`然后执行COMMANDS列表。否则,每个“elif COMMANDS”列表都是

依次执行,如果其退出状态为零,则相应的

`然后执行COMMANDS列表,if命令完成。否则

 执行“else COMMANDS”列表(如果存在)。的退出状态

 整个构造是最后执行的命令的退出状态,或为零

 如果没有条件测试为真。

PS:使用if判断时,需要在判断结束处填入"fi",表示if语句块的结束

if COMMANDS; then

       COMMANDS

[ elif COMMANDS ]; then

         COMMANDS

[ else COMMANDS; ]

fi

1、shell 算数运算符

在shell中,运算符和其他编程脚本语言一样,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等

|加法 |expr `$a + $b` 结果为 30。
|减法 |expr `$a - $b` 结果为 -10。
*| 乘法 |expr $a \* $b 结果为 200。
/ |除法 |expr $b / $a 结果为 2。
% |取余| expr $b % $a 结果为 0。
= |赋值| a=$b 将把变量 b 的值赋给 a。
==| 相等。用于比较两个数字,相同则返回 true(真)。| [ $a == $b ] 返回 false(假)。
!= |不相等。用于比较两个数字,不相同则返回 true。 |[ $a != $b ] 返回 true。
 

2、shell关系运算符

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

//-eq 等于(equal)
if [ "$a" -eq "$b" ]
//-ne不等于(no equal)
if [ "$a" -ne "$b" ]
//-gt大于(greater than)
if [ "$a" -gt "$b" ]
//-ge大于等于
if [ "$a" -ge "$b" ]
//-lt小于(less than)
if [ "$a" -lt "$b" ]
//-le小于等于
if [ "$a" -le "$b" ]
//<小于(在双括号中使用)
(("$a" < "$b"))
//<=小于等于(在双括号中使用)
(("$a" <= "$b"))
//>大于(在双括号中使用)
(("$a" > "$b"))
//>=大于等于(在双括号中使用)
(("$a" >= "$b"))

3、shell字符串运算符

-z: 判断字符串长度为0则为真
-n:判断字符串长度非0则为真
-o:或
-a:与
-x:可执行
-r:可读
-w:可写

 

操作符作用
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空

​​​​4、 shell 文件测试运算符  

操作符

作用
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行

 5、shell逻辑运算符     

&&     命令1 && 命令2   当命令1正确执行(? = 0 ) , 则 命 令 2 才 会 执 行;当命令1执行不正确(?≠0),则命令2不会执行
ll        命令1 || 命令2                当命令1执行不正确(? ≠ 0 ) , 则 命 令 2 才 会 执 行 ;当 当命令1正确执行(?=0),则命令2不会执行

四、case

case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
Execute commands based on pattern matching.
    
Selectively execute COMMANDS based upon WORD matching PATTERN.  The
`|' is used to separate multiple patterns.
    
Exit Status:

Returns the status of the last command executed.

根据WORD匹配的PATTERN有选择地执行COMMANDS。这个

`|'用于分隔多个模式。

case $变量名 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

*)

默认执行的命令序列

;;

esac

说明:

1、表达式expr按照顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面所有命令,然后退出case.

2、如果expr没有找到匹配模式,则执行默认值“*)”后面的命令块(类似于if语句中的else块);“*)”块可以不出现。

3、所给的匹配模式“pattrer?"中可以含有通配符和逻辑或“|”,

4、除非特殊需要,否则每个命令块的最后必须有一个双分号";;",可以独占一行,或者放在语句块最后一个命令的后面。

五、for循环

for: for NAME [in WORDS ... ] ; do COMMANDS; done
Execute commands for each member in a list.
The `for' loop executes a sequence of commands for each member in a
list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
assumed.  For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done 

Arithmetic for loop. 

for:代表NAME[大写…];执行命令;完成

为列表中的每个成员执行命令。

“for”循环为

项目列表。如果“大写…;”不存在,则“in“$@”为

假设。对于WORDS中的每个元素,NAME设置为该元素,并且

执行命令。

退出状态:

返回上次执行的命令的状态。

用于(:用于((exp1;exp2;exp3));执行命令;完成

循环的算术。

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done

exp1 exp2 exp3 是三个表达式,其中exp2是判断条件,for循环根据exp2的结果来决定是否继续下一次的循环

执行过程: 先执行exp1 再执行exp2,如果它的判断结果成立,则执行循环体中的语句,否则结束整个循环 执行完循环体再执行exp3 重复执行步骤2和3,知道exp2的判断结果不成立,就结束循环

for (初始化条件;判断条件;自增或自减)

for ((i=1;i<100;i++))

let a=i++ 先赋值 再运算 所以显示就是为1

let b=++y 先运算 再赋值 所以显示就是为2

#!/bin/bash

for ((sum=0;i<=100;i++));do
   let  sum+=i
done
  echo sum=$sum

这是一个死循环

for((;;));do echo "for";sleep 1;done

六、while 循环

while: while COMMANDS; do COMMANDS; done
 

while  commands;do

        循环体

done

语法格式一:

while [条件];do

        操作

done

while的特殊用法二:从一个文件中读取每一行赋值给变量

while read LINE; do      (read LINE 变量LINE为文件中的每一行进行循环)

done < /PATH/TO/SOMEFILE   (输入重定向需要读取的文件)

read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。还记得whilewhile条件循环语句根据其后的命令退出状态来判断是否执行循环体吗?是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续进行;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。

while  :  永远为真,永远为真,就成了一个死循环。他会不断地执行判断。

until 无限循环

until false;do

        循环体

done

until false : 永远为假,

七、shift 

shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。

从上可知 shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。

8、select 

select: select NAME [in WORDS ... ;] do COMMANDS; done

实例:

select i in 牛肉 猪肉 鲍鱼 拉面;do echo $i;done

 select

PS3: 提示类似read

内置变量:$REPLY  会把用户输入的传给变量。

break:退出循环

9、function 函数

function: function name { COMMANDS ; } or name () { COMMANDS ; }

函数:函数名{COMMANDS;}或名称(){COMMANDS;}

函数由两部分组成:函数名和函数体

定义shell函数。

#!/bin/bash
function disable_firewalld_selinux () {
    systemctl stop firewalld
    systemctl disable firewalld
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

}

disable_firewalld_selinux

函数调用

#!/bin/bash

.  functions (定义函数的函数文件名字)

   函数  (函数文件中定义的函数名)

函数内定义变量,只在函数内部里面执行。

local   变量名

a=b

echo $a

action 显示颜色成功或者失败

./etc/init.d/functions   调用函数functions

    . /etc/init.d/functions
    action "这是one test condition"   ----ok

    action "这是one test condition"  false

 bash action.sh 
这是one test condition                                     [  OK  ]

这是one test condition                                     [FAILED]

return 退出函数还不是退出脚本。

10、expect 

yum -y install expect

expect中的相关命令 spawn:

启动新的进程 send:

向进程发送字符串 expect:

从进程接收字符串 interact:

允许用户交互 exp_continue 匹配多个字符串时在执行动作后加此命令

expect最常用的语法(tcl语言:模式-动作)

单一分支模式的语法: expect "hi" { send "You said hi\n" } 匹配到 hi 后,会输出"you said hi",并换行

多分支模式的语法: expect "hi" { send "You said hi\n" } \ "hehe" { send “Hehe yourself\n" } \ "bye" { send "Goodbye\n" } 匹配 hi, hehe, bye 中的任意字符串时, 发送相应字符串。等同于: expect { "hi" { send "You said hi\n" } "hehe" { send "Hehe yourself\n" } "bye" { send "Goodbye\n" } }

执行 expect 不能以 `bash file` 的方式来执行 (开启一个子shell进程) 必须通过 `chmod +x file ; ./file` 这样的方式 (不会开启子shell进程, 只在当前shell环境中执行) expect 如果只交互一次如拷贝文件 结尾就使用 `expect eof` 如果需要连续交互如登录远程主机执行各种命令结尾就需使用 `interact`

#!/usr/bin/expect

spawn  scp /etc/fstab   127.0.0.1:/data

expect {

        "yes/no"   { send "yes\n";exp_continue}

        "pssword { send "123456" }

}

expect eof

expect 支持变量

set   ip  127.0.0.0  这是个例子

shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

获取数组中的所有元素

使用 @ 或 * 可以获取数组中的所有元素,例如:

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

七、正则表达式匹配简单语法汇总

1、字母:匹配单个字母

A:表示匹配字母A;
\\:匹配转义字符“\”;
\t:匹配转义字符“\t”;
\n:匹配转义字符“\n”;

2、一组字符:任意匹配里面的一个单个字符

[abc]:表示可能是字母a,可能是字母b或者是字母c;
[^abc]:表示不是字母a,字母b,字母c的任意一个;
[a-zA-Z]:表示全部字母中的任意一个;
[0-9]:表示全部数字的任意一个;

3、边界匹配

^:表示一组正则的开始;
$:表示一组正则的结束;

4、简写表达式:每一位出现的简写标记也只表示一位

· :表示任意的一位字符;
\d :表示任意的一位数字,等价于“[0-9]”;
\D :表示任意的一位非数字,等价于“[~0-9]”;
\w :表示任意的一位字母、数字、_,等价于“[a-zA-Z0-9_]”;
\w :表示任意的一位非字母、数字、_,等价于“[^a-zA-Z0-9_]”;
\s :表示任意的一位空格,例如:\n、\t等;
\S :表示任意的一位非空格;

5、数量表示:之前所有的正则都只是表示一位,如果要表示多位,则就需要数量表示。

?:此正则出现0次或1次;
*:此正则出现0次、1次或多次;
+:次正则出现1次或多次;
{n}:此正则出现正好n次;
{n,}:此正则出现n次以上;
{n,m}:此正则出现n – m次。

6、逻辑表示:与、或、非

正则表达式A正则表达式B: 表达式A之后紧跟着表达式B;

正则表达式|A正则表达式B: 表示表达式A或者表达式B,二者任选一个出现

正则表达式):将多个子表达式合成一个表示,作为一组出现。

关于单双引号的问题:
双引号能够识别变量,双引号能够实现转义(类似于“\*”)
单引号是不能识别变量,只会原样输出,单引号是不能转义的

符号         作用
’ ’    单引号。在单引号中所有的特殊符号,如“$”和”(反引号)都没有特殊含义。单引号括起来的都是普通字符,会原样输出
“ ”    双引号。在双引号中特殊符号都没有特殊含义,但是“$”,“`”(esc键下面)和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
· ·    反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和( ) 作 用 一 样 , 不 过 推 荐 使 用 ()作用一样,不过推荐使用()作用一样,不过推荐使用(),因为反引号非常容易看错。
$()    和反引号作用一样,用来引用系统命令。(推荐使用)
()    用于一串命令执行时,()中的命令会在子Shell中运行
{}    用于一串命令执行时,{ }中的命令会在当前Shell中执行。也可以用于变量变形与替换。
[ ]    用于变量的测试。
#    在Shell脚本中,#开头的行代表注释。
$    用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
\    转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用


 

转义指的是使用转义符引用单个字符,从而使其表达单纯的字符的字面含义,而不解释其特殊的含义。shell中的转义字符为"",例如:想打印字符"$one",不使用转义,若该变量未被声明,则打印空行;想打印"$one",需要在$面前加转义


 

"和` `的区别

" " 强引用

' ' 引用的是变量本身的值。

\ 转义,凡是使用特殊含义的。

` ` 反引号代表着命令替换 等价于$() 反引号中的shell命令会先被执行

{} 集合

[] 条件测试

[[ ]] 条件测试、支持正则

$[ ] 整数运算

 $(())整数运算

${ }通常用于划定变量名的边界 等同于 $变量名

shell编程之expect

expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了expect就是一套用来实现自动交互功能的软件需要自行安装

yum install -y expect

expect基础
在使用expect时,基本上都是和以下四个命令打交道:

命令    作用
spawn    启动新的进程
expect    从进程接收字符串
send    用于向进程发送字符串
interact    允许用户交互
spawn命令用来启动新的进程,spawn后的expect和send命令都是和使用spawn启动的新进程进行交互。
expect通常用来等待一个进程的反馈,我们根据进程的反馈,再使用send命令发送对应的交互命令。
send命令接收一个字符串参数,并将该参数发送到进程。
interact命令用的其实不是很多,一般情况下使用spawn、expect和send和命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

#!/usr/bin/expect -f
spawn fdisk /dev/sdb
set timeout 1
#set hwb "Command (m for help):"
expect {
      "Command (m for help):"  { send "n\r"; exp_continue };
      "Select (default p):" {send "p\r"; exp_continue };
      "Partition number (1-4, default 1):" {send "1\r"; exp_continue };
      "First sector (2048-41943039, default 2048):" {send "\r"; exp_continue};
}    

expect {
     "Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):" { send " \r"; exp_continue};
}

expect {
     "Command (m for help):"  { send "w\r"; exp_continue };

}
 

spawn                 交互程序开始,执行后面的命令或程序。

set timeout n     设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时

set    定义变量

$argv    expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推

expect    从交互程序进程中指定接收信息, 如果匹配成功, 就执行

send的指令交互;否则等待timeout秒后自动退出expect语句

send    如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查

exp_continue    表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

exit    退出expect脚本

expect eof    spawn进程结束后会向expect发送eof,接收到eof代表该进程结束

interact    执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上

puts    输出变量(打印字符串,类似于echo)
 

basename:去掉文件名的路径和后缀 

habsename path suffix -->如果指定了suffix ,basename就会吧路径和suffix都去掉
eg:
$ basename /tmp/test/file.txt #只指定了文件名
file.txt
$ basename /tmp/test/file.txt .txt #指定了文件名和后缀
file
basename 至多只能带两个参数,多了就会报错

参数使用实例

*$0~$6分别指向: 
* mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
* $0 $1 $2 $3 $4 $5 $6 
*

53 if [ -z "$6" -o "$6" = "NULL" ] ; then               *判断$6长度若为0或等于NULL为真
54 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56 ln -s ${LNPREFIX}arch-$6 asm-$2/arch         *$6!=0,所以执行else语句, ln -s arch-s3c24x0 asm-arm/arch 
                                                                               * ${LNPREFIX}未定义为空,使用软连接使asm-arm/arch指向arch-s3c24x0 
                                                                               * arch:architecture,CPU架构,作用是设置CPU架构为arch-s3c24x0 架构

 

#!/bin/sh

case $1 in

        start | begin)

          echo "start apache"

        ;;

        stop | end)

          echo "stop apache"

        ;;

        *)

          echo "apache start fail"

        ;;

esac
 

正则表达式:

单引号''和双引号""

两者都是解决变量中间有空格的问题。

在bash中“空格”是一种很特殊的字符,比如在bash中这样定义str=this is String,这样就会报错,为了避免出错就得使用单引号''和双引号""。

单引号'',双引号""的区别是单引号''剥夺了所有字符的特殊含义,单引号''内就变成了单纯的字符。双引号""则对于双引号""内的参数替换($)和命令替换(``)是个例外

比如说   n=3

      echo '$n'

结果就是$n

改成双引号  echo "$n",结果就是3

反引号``

反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。语法:`command`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值