1、shell脚本的基本知识——变量、字符串、循环

目录

一、基本知识

二、 shell的变量和赋值

1、注意

2、变量的种类

 3、例子

 三、特殊符号

1、单引号、双引号、反引号

2、管道

 3、大于号>和小于号<(重定向)

(1)常识

(2)应用(描述符在右边的时候,应该加上&符号)

(3)>和>>的区别

四、字符串操作

1、计算字符数

2、删除字符串左边部分字符

3、删除字符串右边的字符

五、测试语句

六、逻辑语句

1、if-elif

2、多路分支

3、for循环

4、ifeq

一、基本知识

  1. shell是解析型语言,不需要编译器编译
  2. #!/bin/bash:表示用/bin/bash工具编译

二、 shell的变量和赋值

1、注意

(1)Shell在赋值的时候两边没有空格

(2)shell右边是单词组的时候,必须有双引号

(3)变量的格式跟C语言一样

2、变量的种类

 3、例子

hello.sh中
echo "参数个数:"$#                       //3
echo "所有参数@" $@                      //123 hi hhh
echo "所有参数*" $*                        //123 hi hhh
echo "上一条shell命令的返回值*" $?        // 0
echo "第三个参数*" $3                      //hhh

在命令行中输出

./hello.sh 123 hi hhh

 三、特殊符号

1、单引号、双引号、反引号

2、管道

ls -l | wc当中,ls -l收集当前目录下文件的信息,然后送给管道,wc从管道读出来,计算出行数、单词个数和总字符

 3、大于号>和小于号<(重定向)

(1)常识

进程在运行的时候系统回打开三个文件,为标准输入(0),标准输出(1)(显示屏显示的是从1号描述符中读出来的),标准出错(2)

(2)应用(描述符在右边的时候,应该加上&符号)

ls -l 1>a.txt  

本来命令是要输出到1号描述符,重定向后输出到a.txt

echo 0<b.doc

原本从键盘读取文件,现在变为从b.doc读取数据

echo “hello world” 1>&2:

Hello world原本要输入到1号描述符,变成输出到2号描述符

即将一句话输出到标准出错设备中去

cat > name

从标准输入中获取信息,并直接写入到文件name中

Cat >name <a.txt

把a.txt的内容作为输入,然后>输出到name

(3)>和>>的区别

>,文件存在,删除重新创建

>>,文件存在则追加

四、字符串操作

1、计算字符数

time="today is `date`"

echo "time 的字符数: ${#time}"

2、删除字符串左边部分字符

path="/etc/rc0.d/Z20openbsd-inetd"

level=${ path#/etc/rc[0-9].d/[AZJ]}

echo $level (输出:20openbsd-inetd

3、删除字符串右边的字符

path="/etc/rc0.d/Z20openbsd-inetd"

vel=${ level%%[a-zA-Z]*}

echo $vel   (输出:/etc/rc0.d/Z20)(特殊符号不在考虑范围内,例如当中的”-“)

五、测试语句

六、逻辑语句

1、if-elif

字符串是否相等

if [ "$var1" = "$var2" ]

文件是否存在并可读

if test -e name && test -r name

文件是否存在并可读

if [ -e name ] && [ -r name ]

if [ -e file ] && [ -r file ]

then

        cat file # 如果文件存在且可读,则显示该文件内容

elif [ -e file ] # 判断文件是否存在

then

        chmod u+r file # 让用户的权限添加可读

        cat file # 如果文件存在但不可读,则加了读权限之后再显示其内容

else

        touch file # 如果文件不存在,则创建该空文件

fi

2、多路分支

read VAR # 从键盘接收一个用户输入

case $VAR in # 判断用户输入的值$VAR

        1) echo "one" # 如果$VAR 的值为 1,则显示 one

        ;; # 每个分支都必须以双分号作为结束(最后一个分支除外)类似于break

        2) echo "two" 

        ;;  

        *) echo "unknown" # 星号* Shell 中的通配符,代表任意字符。

esac

注意事项:

1、变量 VAR 的值实际上是字符串,因此上述代码中的 1) 也可写成 “1”)

2、整个 case 结构必须 esac 作为结束。

问题:”\r“:command not found

编辑器结束符号有两种

  1. 换行符\n(LF)
  2. 结束符\r+换行符\n(CRLF)

3、for循环

files=`ls` # 在当前目录下执行 ls,将所有的文件名保存在变量 files

        for a in $files # 循环地将 files 里面的每个单词赋给 a,赋完则退出循环

        do

                if [ -f $a ] # 如果文件$a 是一个普通文件,那么就计算他的行数

                then

                        wc -l $a

                fi

        done

4、ifeq

ifeq ($(OS), Linux)
    $(info Running on Linux)   //如果成立,则输出Running on Linux)
else
    $(warning This Makefile is intended for Linux)   

//如果不成立,则输出警告:This Makefile is intended for Linux
endif

.PHONY: all

all:
    @echo "Building target..."
    # 其他构建命令和规则
 

猜你喜欢

转载自blog.csdn.net/weixin_45981798/article/details/131757296