美文网首页
《Shell》

《Shell》

作者: 孔朝阳 | 来源:发表于2021-06-16 19:28 被阅读0次

一、资料

Shell菜鸟教程

二、简介

1、Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
2、Shell 脚本(shell script),是一种为 shell 编写的脚本程序
3、运行 Shell 脚本有两种方法:

#!/bin/sh
echo "Hello, Shell!"

#作为可执行程序
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

#作为解释器参数
/bin/sh test.sh

4、可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n

#!/bin/sh
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

sh test.sh K Z Y

#参数个数
$#
#以字符串形式显示所有参数
$*

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

$@
echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done
#显示Shell使用的当前选项
$-

三、语法

1、Shell 命令

1、#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
2、以 # 开头的行就是注释,会被解释器忽略
3、echo 命令用于向窗口输出文本

# 显示普通字符串
echo "It is a test"
# 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
# 显示命令执行结果
echo `date`
# 显示结果定向至文件
echo "It is a test" > myfile

4、printf 命令模仿 C 程序库(library)里的 printf() 程序
5、 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
6、[] 执行基本的算数运算

#!/bin/bash

a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"
#
result 为: 11

7、expr 是一款表达式计算工具,使用它能完成表达式的求值操作(注意使用的是反引号 ` 而不是单引号 ')

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

8、let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量

2、运算符

2.1、算数运算符

条件表达式要放在方括号之间,并且要有空格,例如: [a==b] 是错误的,必须写成 [ a ==b ]

# 加
val=`expr $a + $b`
# 减
val=`expr $a - $b`
# 乘
val=`expr $a \* $b`
# 除
val=`expr $a / $b`
# 求余
val=`expr $a % $b`
# 等于
if [ $a == $b ]
# 不等于
if [ $a != $b ]

2.2、关系运算符

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

# -eq 检测两个数是否相等,相等返回 true
if [ $a -eq $b ]
# -ne 检测两个数是否不相等,不相等返回 true
if [ $a -ne $b ]
# -gt 检测左边的数是否大于右边的,如果是,则返回 true
if [ $a -gt $b ]
# -lt 检测左边的数是否小于右边的,如果是,则返回 true
if [ $a -lt $b ]
# -ge 检测左边的数是否大于等于右边的,如果是,则返回 true
if [ $a -ge $b ]
# -le 检测左边的数是否小于等于右边的,如果是,则返回 true
if [ $a -le $b ]

2.3、布尔运算符

# ! 非运算,表达式为 true 则返回 false,否则返回 true
if [ $a != $b ]
# -a 与运算,两个表达式都为 true 才返回 true
if [ $a -lt 100 -a $b -gt 15 ]
# -o 或运算,有一个表达式为 true 则返回 true
if [ $a -lt 100 -o $b -gt 100 ]

2.4、逻辑运算符

# 逻辑的 AND
if [[ $a -lt 100 && $b -gt 100 ]]
# 逻辑的 OR
if [[ $a -lt 100 || $b -gt 100 ]]

2.5、字符串运算符

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

2.6、文件测试运算符

file="/var/www/runoob/test.sh"
# -d 检测文件是否是目录,如果是,则返回 true
if [ -d $file ]

3、变量

1、定义变量时,变量名不加美元符号,变量名和等号之间不能有空格
2、使用一个定义过的变量,在变量名前面加美元符号,推荐给所有变量加上花括号
3、使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
4、使用 unset 命令可以删除变量,不能删除只读变量

# 定义
your_name="runoob.com"
# 使用
echo $your_name
echo ${your_name}

a=10
b=20
var=$[a+b]
echo ${var}

4、函数

1、定义格式:

[ function ] funname [()]
{
    action;
    [return int;]
}

2、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
3、调用函数仅使用其函数名即可,函数返回值在调用该函数后通过 $? 来获得

#!/bin/bash
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    aNum=$1
    anotherNum=$2
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn 1 2
echo "输入的两个数字之和为 $? !"

5、流程控制

sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else

# if 语句
if condition
then
    command1 
    command2
    ...
    commandN 
fi

# if else 语句
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

# if else-if else
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

# for 循环
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

# while 循环
while condition
do
    command
done

# until 循环
until condition
do
    command
done

# case 语句
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

6、文件包含

Shell 也可以包含外部脚本,可以很方便的封装一些公用的代码作为一个独立的文件,Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
or
source filename

四、数据类型

1、字符串

1、字符串可以用单引号,也可以用双引号,也可以不用引号
2、推荐使用双引号,双引号里可以有变量,双引号里可以出现转义字符

#!/bin/sh
your_name="runoob"
# 使用双引号拼接
greeting="hello, ${your_name} !"   

string="runoob is a great site"
#获取字符串长度
echo ${#string} 
#提取子字符串                    
echo ${string:1:4} 
#查找子字符串,脚本中 ` 是反引号,而不是单引号 '                 
echo `expr index "$string" io`      

2、数组

1、Shell 只支持一维数组,不支持多维数组
2、在 Shell 中用括号来表示数组,数组元素用"空格"符号分割开

# 定义数组
array_name=(value0 value1 value2)
# 读取数组
${数组名[下标]}
value=${array_name[index]}
# 获取所有元素
${my_array[@]}
# 获取数组长度
${#array_name[@]}
${#array_name[*]}

五、Linux命令

1、文件管理相关命令

// list file(列出目录)
ls
-a 全部
-d 仅列目录

cd // change directory
pwd // print work directory
mkdir // make directory
rmdir // remove directory
cp // copy file
rm // remove 
mv // move

2、文件内容相关命令

//  由第一行开始显示文件内容
cat
// 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
tac
// 显示的时候,顺道输出行号!
nl
// 一页一页的显示文件内容
more
// 与 more 类似,可以往前翻页!
less
// 只看头几行
head
// 只看尾巴几行
tail

1、find

find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

# 语法
find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;
# 按名称查找
find . -name test.txt
# 模板查找,注意加引号
find . -name "*.txt"
 #查找当前目录及子目录下所有的普通文件
find . -type f -print  
#查找当前目录及子目录下所有的目录
find . -type d -print  
# 按名称查找,限制最大层级
find . -name "*.txt" -maxdepth 3

2、grep

grep 命令用于查找文件里符合条件的字符串

grep "PodTestTests" . -R -n
# 排除
grep -v 

相关文章

  • Shell 学习

    shell 变量 shell 参数传递 shell 数组 shell 运算符 shell echo 命令 prin...

  • Shell 概述

    学习 Shell 主要包括的内容: Shell 脚本入门 Shell 变量 Shell 内置命令 Shell 运算...

  • Shell 教程

    Shell 变量 Shell 传递参数 Shell 数组 Shell 基本运算符 Shell echo 命令 Sh...

  • shell 第一天

    shell编程初识 1.1 shell编程初识 shell的定义 Shell 是命令解释器 Shell 也是...

  • shell 案例

    Shell编程一 Shell防范ARP攻击 Shell编程二 Shell防范DDos攻击 Shell编程三 ...

  • 【生物信息笔记】shell 脚本 (dry-2)

    shell 和 shell script(脚本)区别: shell 和 shell 脚本是两个不同概念,shell...

  • Linux Shell:基础知识和Shell变量

    摘要:Linux,Shell 整理Shell内容要点: Shell基础知识 Shell变量的类型 Shell变量赋...

  • Shell脚本语言一

    一、语法 格式 运行 Shell变量 Shell字符串 Shell数组 Shell注释 Shell传递参数 She...

  • 使用shell脚本

    使用方式 shell 变量 shell 字符串操作 shell 数组 shell 注释 shell 命令行参数 s...

  • vim学习 09——shell命令

    vim学习 09——shell命令 执行 shell 命令 :!shell命令 : 可以执行 shell 命令。 ...

网友评论

      本文标题:《Shell》

      本文链接:https://www.haomeiwen.com/subject/rewoaqtx.html