2023.9.19(shell相关)

shell基础

shell是命令解释器(command interpreter),是操作系统的用户接口。

输入/输出重定向

  • 输出重定向追加:

command[参数]>>文件名

command[选项] 2>错误文件名

command[选项] 2>>错误文件名

eg.ls /dev/std*

输出中的stdin是输入键盘,staout是显示器,

  • 管道

(1)shell使用管道将一个命令的输出直接作为另一个命令的输入

(2)通过使用管道符号“|”来建立一个管道:

   command_a [参数] | command_b [参数]

   eg.ls dir

   (将ls输出的单词作为下一个命令的输入)

   ls dir|wc -w

   (读出有多少个用空格隔开的单词)

  • 特殊字符

(1)通配符 用于模式匹配,如文件名匹配,路径名搜索,字符串查找等。包括*,?和括在方括号[]中的字符序列。

(2)引号

  • 单引号:由单引号括起来的字符都作为普通字符出现,特殊字符被单括号括起来之后也会失去原有的意义,只作为普通字符来解释。

  • 双引号:由双引号括起来的字符,除$,\,'和"这几个字符仍是特殊字符保留其特殊功能外,其余字符作为普通字符对待。

  • 反引号“()”:其括起来的字符会被shell解释为命令,shell会优先执行该命令,然后将得到的字符替换掉反引号中原有的命令。

  • 别名 命令别名通常是其他命令的缩写,用来减少键盘输入,命令格式为: alias alias-name = 'original-command'

shell脚本

  • 什么是shell脚本? 是使用shell脚本命令编写的文件,也称为shell script. 与结构化程序不同,shell不需要编译成目标程序,也不需要链接成可执行的目标码。

  • shell脚本执行方式:

   1.为脚本文件加上可执行权限,切换到shell脚本所在的目录执行它; (添加权限的方法:chmod + x hello.sh)

   2.以绝对路径的方式去执行bash shell脚本(可以在当前目录下执行,也可以不在当前目录下执行);

   3.sh shell脚本名(在工作目录下/root/bin);

   4.在当前shell环境中执行用. hello.sh或source hello.sh来执行bash shell脚本。

总结:前三种方法执行shell脚本时都是在当前shell(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行,shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。而方法四则是在当前shell中执行的。

shell变量

  • 在shell脚本中也可以使用变量,一个变量就是内存中被命名的一块存储空间

  • 用户自定义变量

   1.Variable-name=value

   注意:如果字符串里面包含空格,就必须用括号把他们括起来,注意在等号两边不能有空格。

   2.清除变量 unset variavle-name

  • 环境变量 保存和系统操作环境相关的数据。$HOME,$PWD,$SHELL,$USER等等。

  • 位置变量

  1. 如果脚本程序在执行时带有参数,就会创建一些额外的变量,这些额外的变量和变量所在命令行位置有关。

  2. 当命令行上的命令参数超过9个时,shell提供了shift命令将全部的命令参数都左移一位

shell编程基础

shell脚本的输入/输出

  • 使用read命令可以将用户的输入赋值给一个变量

  • echo默认情况下是换行标准输出语句,echo输出多个空格时必须用括号括起来

   eg.echo "please input:"

   输出为:please input:

  • export命令: 可将shell脚本中定义的变量导出到子shell中,并使之在子shell中有效。

   eg.定义两个变量:var1=hello,var2=world 写一个脚本,包括命令echo "var1"和echo "var2" 运行脚本,无输出使用

shell的逻辑运算

  • 条件测试(有两种测试命令)

  1.test 条件表达式

  2.[条件表达式]

  注:使用第二种方式进行条件测试时,必须在[]前后保留空格,否则shell会提示出错。

三种测试类型:

1.字符串比较

①string1 = string2 如果两个字符串相同结果为真

②string1 != string2 如果两个字符串不相同结果为真

③-n string 如果字符串不为空则为真

④-z string 如果字符串为空(一个空串)则为真

注:”=“前后都有空格

2.算数比较

①expression1 -eq expression2 如果两个表达式相等则结果为真

②1 -ne 2 不等则为真

③1 -gt 2 1大于2则结果为真

④1 -ge 2 1大于或者等于2则结果为真

⑤1 -lt 2 1小于2则结果为真

⑥1 -le 2 1小于或者等于2则结果为真

3.文件条件测试

①-d file 如果文件是一个目录则结果为真

②-e file 如果文件存在则结果为真 ③-f ④-g ⑤-r ⑥-s ⑦-u ⑧-w ⑨-x

  • OR运算

它用于在条件测试中结合多个条件,并且只要其中一个条件为真(true),整个表达式就为真。

#!/bin/bash

value=10

# 使用逻辑 OR 运算测试两个条件
if [ $value -eq 5 ] || [ $value -eq 10 ]; then
    echo "value 等于 5 或 10"
else
    echo "value 不等于 5 且不等于 10"
fi

在这个示例中,如果 $value 的值等于 5 或 10 中的任何一个,条件测试将为真,因此将输出 "value 等于 5 或 10"。

shell控制结构

  • if 语句

    提供条件测试,根据测试的条件结果执行相应的语句

    基本语句:

    if condition
    then
      statements
    else
    statements
    fi

    另外一种格式:

    if condition 1;then
    statements
    elif condition2;then
    statements
    else...

  • case语句

    是一个多分支结构,用于测试一个变量与多个模式(pattern)之间的匹配情况,类似于switch语句,但是更灵活。语法格式如下:

    case 变量 in
    模式1)
        命令1
        ;;
    模式2)
        命令2
        ;;
    *)
        默认命令
        ;;
    esac

    eg.

    case $number in
    1)echo "Monday";;
    2)echo "Tuesday";;
    3)echo "Wendsday";;
    *)echo "你输入了其它数字";;
    esac

    case支持合并匹配模式,即在每一个模式中,可以使用通配符或者逻辑符号。例如,使用问号(?)来匹配单个字符,使用星号(*)来匹配任意数量的字符。

    eg.使用方括号"[]"来定义模式。

    #!/bin/bash
    echo"请输入一个字符串:"
    read str
    case $str in
    [a-z])
        echo"你输入了一个小写字母"
        ;;
    [A-Z])
        echo"你输入了一个大写字母"
        ;;
    [0-9])
        echo"你输入了一个数字"
        ;;
    ?)
        echo"你输入了一个单个字符"
        ;;
    *)
        echo"你输入了一个字符串"
        ;;
    esac

    若一个分支要包含多条命令,则一条命令结束后直接回车换行,每一个分支用“;;”隔开。

  • for语句:可以用来循环处理一组值,这组值可以是任意字符串的集合。

    #!/bin/bash
    for var in hello world 123
    do
      echo $var
    done
    exit 0

    通配符扩展(输出一个一个以空格隔开的字符串)

    #!/bin/bash
    for file in $(ls )
    do
    echo $file
    done
    exit 0

    for循环中的参数值也可以从命令行中取得。

  • while循环

    -n "please enter password:"
    read password
    while ["$password" != "123456"]
    do 
    echo "sorry,try again"
    read password
    done
    exit 0

    往f1文件里面添加数据:

    echo "11 aa">f1

    读文件中的数据

    while read -r line//每次读取一行,文件数据读完就结束循环
    do 
    echo $line
    done  <f1

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值