星星博客 »  > 

2021-06-03

shell学习

1, shell是个啥?

1.1, shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

1.2 , shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,一般的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

2, shell 的第一个程序

2,1, 创建一个hello.sh 的文件

#!/bin/bash
echo "hello world!"

2.2, shell的运行方式

1 , sh hello.sh

2, bash hello.sh

3, bash /home/carey/shellDatas/hello.sh

4, 修改文件的权限 ,用 ./hello.sh

3, shell 变量

3.1, 系统变量

系统变量有

  1. $HOME 当前的家目录
  2. $PWD 当前目录
  3. $USER 当前用户
  4. $SHELL 当前默认的解析器

3.2, 自定义变量

3.2.1, 定义变量

a=10 #等号两边不能有空格,不需要声明。输出需要在前加上 $

例如:

​ 控制台输入: a=10

​ 输入:echo $a

​ 就输出:10

3.2.2, 撤销变量

unset 变量名

3.2.3, 声明静态变量

readonly 变量名 只能读不能写, 不能撤销, 重启之后自动释放

3.2.4, 全局变量

export 变量名 可供其他的shell程序使用

3.2.5, 注意事项

  1. 等号两边不能有空格
  2. 在bash中,变量默认类型为字符串 ,无法直接进行值运算
  3. 变量的值如果有空格,需要用单/双引号

3.3, 特殊变量

3.3.1, $n

Sn(功能描述: n为数字,SO代表该脚本名称,$1-S9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如S{10}) .

3.3.2, $#

$#(功能描述:获取所有输入参数个数,常用于循环)。

3.3.3, $*

S*(功能描述:这个变量代表命令行中所有的参数,S*把所有的参数看成一个整体)。

3.3.4, $@

S@(功能描述:这个变量也代表命令行中所有的参数,不过S@把每个参数区分对待),

3.3.5, $?

$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。),

4, 运算符

  1. $((运算式)) 或 $[运算式]
  2. expr +,-,*,/,% (expr运算符之间有空格)

注意:

2+3*5的表达方式为:
expr `expr 2 + 3` \* 5   或
a=$[(2+3)*5]

5, 条件判断

5.1, 基本语法

[ condition ] (condition前后有空格)

5.2 常用判断条件

(1)两个整数之间比较s
=字符串比较;

-小于(less than) -le 小于等于(less equal)
-eq等于(equal) -gt大于( greater than) .
-ge大于等于( greater equal) -ne不等于(Not equal) .

(2)按照文件权限进行判断
-r存读的权限(read)
-w有写的权限( write)" -x有执行的权限( execute)

(3)按照文件类型进行判断,
-f文件存在并且是一个常规的文件(file) , -e文件存在( existence)
-d文件存在并是一个目录( directory) .

eg: 
		[ 23 -ge 22 ]
		[ -w stu01.sh ]
		[ -e ./sed.txt ]
	用  echo $?		来判断真(0)假(1 )

6, 流程控制

6.1, if 判断

if [ 条件判断式 ];then

​ 程序

fi

​ 或者

if [ 条件判断式 ]

​ then

​ 程序

fi

注意事项:[ 条件判断式 ] 两边必须有空格, if 后面也一个空格

#!/bin/bash
if [ $1 -eq 1 ];then
        echo "$1 eq 1 "

elif [ $1 -eq 2 ];then
        echo '$1 eq 2'

fi

6.2, case语句

直接代码理解吧,难得写

#!/bin/bash
case $1 in
        1)
                echo "this is 1"
                ;;
        2)
                echo 'this is 2'
                ;;
        *)
                echo "this is other"
                ;;
        esac

6.3, for 循环

第一种

#!/bin/bash
  
s=0

for((i=1;i<=100;i++))
do
        s=$[$s+$i]
done

echo $s

第二种

#!/bin/bash
  
for i in "$*"
do
        echo "$*: this is $i"
done


for j in "$@"
do
        echo "$@: 这是$j"
done

6.4 while循环

#!/bin/bash
  
i=0
s=0
while [ $i -le 100 ]
do
        s=$[$i + $s]
        i=$[$i + 1]
done

echo $s

7, read 读写控制台输入

7.1, 基本语法

read(选项)(参数)

选项:

​ -p: 指定读取时的提示符

​ -t: 指定读取时等待的时间

参数:

​ 变量:指定读取值得变量名

7.2, 例如:

#!/bin/bash
  
read -t 10 -p "请在十秒内输入你的姓名: " NAME

echo $NAME         

8, 函数

8.1, 系统函数

8.1.1 basename函数(获取文件的名称)

  1. basename基本语法
    basename[string / pathname] [suffix] (功能描述: basename命令会删掉所有的前缀包括最后一个I(/’)字符,然后将字符串显示出来。

选项:,
suffix为后缀,如果suffix被指定了, basename会将pathname或 string 中的 suffix去掉。

  1. 例如:

控制台输入:

basename /home/hhhh/shell/hello.sh

会输出:

hello.sh

控制台输入:

basename /home/hhhh/shell/hello.sh .sh

会输出:

hello

8.1.2 dirname函数(获取文件的绝对路径)

  1. dirname基本语法。dirname文件绝对路径 功能描述:从给定的包含绝对路径的文件名中去除文件名
    (非目录的部分),然后返回剩下的路径(目录的部分)),

    例如:

    dirname /home/hhhh/shell/hello.sh

    输出: /home/hhhh/shell

8.2,自定义函数

8.2.1, 基本语法

[function ] funname[()]{
Action;

​ [return int;]

}

funname

8.2.2,例子

#!/bin/bash
  
function sum()
{
        s=0;
        s=$[$1+$2]
        echo $s
}

read -p "input first number: " p1
read -p "input second number: " p2

sum $p1 $p2

相关文章