ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Shell基础

2021-09-02 22:00:30  阅读:267  来源: 互联网

标签:bin Shell 变量 基础 echo sh 格式 bash


1.Shell概述

Shell 是一个命令行解释器,它接收应用程序、用户的命令,然后调用操作系统的内核

Shell还是一个功能强大的编程语言,易编写,易调试,灵活性强

1.1.Linux中提供的Shell解析器有:

 

[root@master datas]# cat /etc//shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

 

1.1 bash和是的关系

[root@master ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

1.2 Centos默认的解析bash

 

[root@master /]# echo $SHELL
/bin/bash

 

2.Shell脚本基础

 

2.1 脚本格式

 

shell操作linux的桥梁
    创建:
      后缀为.sh的文件
    编写:
      头部注释为#!/bin/sh或者#!/bin/bash(注释可写可不写,建议写上)
    运行:
      1.通过sh命令执行
        例如:sh helloworld.sh

#!/bin/bash
echo "helloworld"

      2.通过bash命令执行
        例如:bash helloworld.sh
      3.通过把文件修改为可执行的文件然后通过./文件命令.sh来执行
        例如:./helloworld.sh(必须在当前目录下)

 

2.2系统预定义变量

1)常用系统变量

  $HOME、$PWD、$SHELL、$USER等

2)查看系统变量的值

[root@master /]# echo $HOME
/root
[root@master /]# echo $PWD
/

3)显示当前Shells中所有的变量:set

[root@master /]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostco
mplete:interactive_comments:progcomp:promptvars:sourcepathBASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()

 

3.自定义变量

 

3.1 基础语法

 

  (1)定义变量:变量=值

 

  (2)撤销变量:unset 变量

 

  (3)声明静态变量:readonly变量,注意:不能unset

3.2 变量定义规则

 

  (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

 

  (2)等号两侧不能有空格

 

  (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

 

  (4)变量的值如果有空格,需要使用双引号或单引号括起来。

 

 

3.3 案列

1)定义和初始化
  格式
    变量名称=值
  例如:
    x=10 "abc edefg"
注意:
  等号两边不能有空格


2)使用:通过$区分变量还是一句话
  格式1:
    $变量
  格式2:
    ${变量}
注意:
  格式1,会把$后所有相连内容看做一个变量
  格式2,${}表示值引用{}之中的内容分,对相连的内容做了一个区分

 

 

4.特殊变量

4.1 $0...$n:表示接收外部参数(执行脚本时,传递的参数

  格式:
    $下标
注意:
  $0永远表示脚本名称(所以脚本名称不算数,$0也不算第一个参数)
  下标大于一位数只能使用${}获取参数,因为$下标只把第一位数据看做下标


  $*获取所有参数
  $#获取所有参数个数(数组集合需要使用)

4.2 引号:
  单引号:安原字符串输出
  双引号:可以引用变量,拥有特殊含义的内容

  拼接:连续获取变量
注意:
  如果有多个引号,连续的形成一对
  引号中使用其他引号,其他引号做字符串使用
  # 变量后面的值,可以使用多个成对出现引号包起来
  # 连续的引号是成对的
  # 每对引号之间不能有空格(空格会把值做一个切分,会报错)


4.3 字符串
1)获取长度
  格式:
    ${#变量}
2)截取:
  格式:
    ${变量:开始位置:长度}
注意:
      ${str::5}:从0获取5个
    ${str:0}:从0获取到末尾
3)替换单个
  格式:
    ${变量/旧/新}
注意:从左向右替换第一个

4)替换所有
  格式:
    ${变量//旧/新}
注意:替换不会再原字符上进行修改,想要修改原字符串只能从新赋值

5)删除
从头开始删除
  ${变量#表达式}:匹配第一个删除
  ${变量##表达式}:匹配最后一个删除
从尾开始删除
  ${变量%表达式}:匹配第一个删除
  ${变量%%表达式}:匹配最后一个删除
注意:

  从未开始删除,表达式还是从左向右去写
  删除不会再原字符上进行修改,想要修改原字符串只能从新赋值

#!/bin/sh

str="abcadefga"
#获取长度  ${#变量}
echo ${#str}

#截取  ${变量:开始位置:长度}
echo ${str::5} #0-5

echo ${str:0}  #0-最后

#替换单个 ${变量/旧/新}

echo ${str/a/b}

#从头开始删除
#  ${变量#表达式}:匹配第一个删除
#  ${变量##表达式}:匹配最后一个删除
#从尾开始删除
#  ${变量%表达式}:匹配第一个删除
#  ${变量%%表达式}:匹配最后一个删除 
echo ${str#a} 
echo ${str##a} 
echo ${str%a} 
echo ${str%%a} 
[root@master datas]# sh str.sh
9
abcad
abcadefga
bbcadefga
bcadefga
bcadefga
abcadefg
abcadefg

 

5.字符串

5.1 算数运算符

bash不支持简单的数学运算,可以通过命令实现expr

  格式1:
    `expr 值 + 值`

注意:符号两边需要加上空格

  格式2:
    $[值+值]

#!/bin/sh
x=12
y=10
echo `expr 10 + 12`
echo $[x+y]

5.2比较运算符

 

格式:
   $[值符号值](符号两边空格加不加无所谓)

注意:比较的结果用1(true)和0(false)表示

符号表示:

== 字符串比较

-lt 小于(less than)       -le 小于等于(less equal)

-eq 等于(equal)      -gt 大于(greater than)

-ge 大于等于(greater equal) -ne 不等于(Not equal)

注意:可以用\<,\>,=,==,表示+= 需要用let关键字,<=需要双括号

5.3 逻辑运算符

   &/and   |/or   !/not

 

    例如:
      #判断2>1结果
        echo $[2 > 1]
      #反转2>1结果
        echo $[!$[2>1]]
      # 反转后面的结果2>1 and 2>3 false0
        echo $[!$[$[2>1]&$[2>3]]]
        echo $[2>1 & 2<1]

6.if判断

 

  格式1:
    if 判断条件
    then
      判断为true执行的代码
    fi
  格式2:
    if 判断条件
    then
      判断为true执行的代码
    else
      判断为false执行的代码
    fi
  格式3:
    if 判断条件
    then
      判断为true执行的代码
    elif 判断条件
    then
    判断为true执行的代码
    。。。
    else
    判断为false执行的代码
    fi
注意:else可加可不加

#!/bin/sh

a=21
b=10
sorce=1
if ((a>b))
then
        echo "true"
fi


if((sorce==100))
then
        echo "满分"
elif  ((sorce>=60))
then
        echo "及格"
else
        echo "不及格"
fi

[root@master datas]# sh if1.sh
true
不及格

 

 


判断条件的写法
  []:[]两边加空格,符号两边加空格并且符号前加转义符
  可以使用字母
  [[]]:[[]]两边加空格,符号两边加空格
  可以使用字母
  ():弃用
  (()):不需要加空格,但是不能使用字母(建议使用这个)
  在使用变量时,不需要使用$

7.for循环

 

java格式:
    for ((初始化变量;判断条件;控制语句))

    do
      执行语句
    done

python格式:

    for 变量 in 结果集

    do
      执行语句
    done
结果集:
    {开始..结束}含头含尾,不能引用变量

    `seq 开始 结束`含头含尾

 

#!/bin/bash

#九九乘法表
#java格式
for((i=1;i<10;i++))
do
for((j=1;j<i+1;j++))
do
        echo -n "$j*$i "=$[$i*$j]
done
        echo " "
done

#python 格式
for i in `seq 1 9`
do
for j  in `seq 1 $i`
do
        echo -n "$j*$i "=$[$i*$j]
done
        echo " "
done

~  

 

[root@master datas]# sh for1.sh
1*1 =1 
1*2 =22*2 =4 
1*3 =32*3 =63*3 =9 
1*4 =42*4 =83*4 =124*4 =16 
1*5 =52*5 =103*5 =154*5 =205*5 =25 
1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 
1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 
1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 
1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81 
1*1 =1 
1*2 =22*2 =4 
1*3 =32*3 =63*3 =9 
1*4 =42*4 =83*4 =124*4 =16 
1*5 =52*5 =103*5 =154*5 =205*5 =25 
1*6 =62*6 =123*6 =184*6 =245*6 =306*6 =36 
1*7 =72*7 =143*7 =214*7 =285*7 =356*7 =427*7 =49 
1*8 =82*8 =163*8 =244*8 =325*8 =406*8 =487*8 =568*8 =64 
1*9 =92*9 =183*9 =274*9 =365*9 =456*9 =547*9 =638*9 =729*9 =81 

 

 

8 .数组

存储多个元素,数据类型可以不同,元素元素之间以空格切分
  操作
    通过下标获取数据
  格式:
    $(数组[下标])
注意:
  直接引用数组变量,默认获取下标为0的元素
  下标使用*表示获取所有
  获取长度:
  格式:
  ${#数组[*]}

#!/bin/bash

arr=(1 2 3 4 5 6 7 8 9)
#通过下标获取数据 $(数组[下标])

echo $((arr[1]))

#获取长度: ${#数组[*]}

echo ${#arr[*]}

#遍历数组
for ((i=0;i<${#arr[*]};i++))
do
        echo ${arr[i]}
done

[root@master datas]# sh arr.sh
2
9
1
2
3
4
5
6
7
8
9

 

 

9. read 键盘录入

 

格式:
  read 变量1 变量2 ...变量n
注意:
  键盘录入时,允许给多个变量进行赋值,值和值之间以空格切分

 

打印三角形

for i in {1..5}
do
for j in `seq 1 ${i}`
do
echo -n "* "
done
echo ""
done


10.函数
格式:
  function 方法名(){
    方法体
  return 数字;
  }
注意:

  function和return可加可不加
  $0...$n表示接收参数,$0永远是脚本名称(忽略)
  方法的调用直接使用方法名不加()
  return只能返回数字范围在0-255之间
  $?接收返回值只能接收一次

获取当前日期时间
ate +"%Y-%m-%d %H:%M:%S"

格式化日期时间:
date -d today +"%Y-%m-%d %H:%M:%S"

加减日期时间
date +%Y%m%d //显示前天年月日
date +%Y%m%d --date="+1 day" //显示前一天的日期
date +%Y%m%d --date="-1 day" //显示后一天的日期
date +%Y%m%d --date="-1 month" //显示上一月的日期
date +%Y%m%d --date="+1 month" //显示下一月的日期
date +%Y%m%d --date="-1 year" //显示前一年的日期
date +%Y%m%d --date="+1 year" //显示下一年的日期

 

重定向:执行命令的结果写写入到文件

  标准输入文件(stdin):stdin的文件描述符为0,默认从stdin读取数据。
  标准输出文件(stdout):stdout 的文件描述符为1,默认向stdout输出数据。
  标准错误文件(stderr):stderr的文件描述符为2,向stderr流中写入错误信息。

使用>,>>默认是把正确信息写入文件
想要把错误信息和正确信息写入文件需要后面追加2>&1(把错误信息当做正确信息去处理)

11.定时器:

格式:
    *(分钟) *(小时) *(星期) *(几号) *(月份) commend

通过crontab -e添加定时任务
查看定时任务是否执行了,看日志tail -f /var/log/cron
注意:
  定时器或脚本中涉及到路劲的全部给绝对路劲

* * * * * 每分钟
*/1 * * * * 每分钟
0 */1 * * * 每小时

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:bin,Shell,变量,基础,echo,sh,格式,bash
来源: https://www.cnblogs.com/lmandcc/p/15220980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有