Shell 学习笔记(持续)

目录

目录

0.参考

一.变量

1.定义

2.使用

3.单引号和双引号的区别

4.变量赋值

5.只读变量

6.删除变量

7.作用域 local 和 global

8.export

二.命令替换

三.字体颜色

四.if 判断

五.case 判断


0.参考

shell编程 — ShellScript 1.0.0 文档

shell在线中文手册abs,shell中文教程,shell中文教程 - 海底苍鹰(tank)博客

cplusplus.com - The C++ Resources Network

一.变量

Shell变量:Shell变量的定义、赋值和删除

1.定义

# Shell 支持以下三种定义变量的方式:
variable=value
variable='value'
variable="value"

注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

2.使用

使用一个定义过的变量,只要在变量名前面加美元符号$即可

#使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:
author="严长生"
echo $author
echo ${author}
#变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
skill="Java"
echo "I am good at ${skill}Script"
#如果不给 skill 变量加花括号,写成echo "I am good at $skillScript",
#解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

3.单引号和双引号的区别

#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2

运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。   === 》对应纯文本

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

我的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

4.变量赋值

variable=`command`
variable=$(command)

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,
反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;
第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

5.只读变量

#!/bin/bash
myUrl="http://c.biancheng.net/shell/"
readonly myUrl
myUrl="http://c.biancheng.net/shell/"

6.删除变量

#!/bin/sh
myUrl="http://c.biancheng.net/shell/"
unset myUrl
echo $myUrl

#上面的脚本没有任何输出。

7.作用域 local 和 global

作用:一般用于shell内局部变量的定义,多使用在函数内部

关于局部变量和全局变量:
(1)shell 脚本中定义的变量是global的,作用域从被定义的地方开始,一直到shell结束或者被显示删除的地方为止。
(2)shell函数定义的变量也是global的,其作用域从 函数被调用执行变量的地方 开始,到shell或结束或者显示删除为止。函数定义的变量可以是local的,其作用域局限于函数内部。但是函数的参数是local的。
(3)如果局部变量和全局变量名字相同,那么在这个函数内部,会使用局部变量。

8.export

export 将自定义变量设定为系统环境变量(仅限于该次登陆操作,当前shell中有效)

​​​​​​shell export 作用 - ze_zhang - 博客园

如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。

export命令将使系统在创建每一个新的shell时,定义这个变量的一个拷贝。这个过程称之为变量输出

1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;

2、一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);

3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失
(并不能返回到父shell中)。

3、不用export定义的变量只对该shell有效,对子shell也是无效的。

整理了一下贴子:为什么一个脚本直接执行和用source执行不一行呢?这也是我自己碰到的一个问题。manual原文是这样的:

Read and execute commands from filename in the current shell environment and
return the exit status of the last command executed from filename.

明白了为什么不一样了吧?直接执行一个脚本文件是在一个子shell中运行的,而source则是在

当前shell环境中运行的。根据前面的内容,你也已经明白其中的道理了吧。

我的理解是 : 想让子shell使用变量的话,主shell可以先定义好变量。如我们环境中的编译脚本,主shell定了了tool chain, path等信息,子shell直接使用就可以,避免了hard code。

二.命令替换

variable=`commands`
variable=$(commands)

#!/bin/bash
begin_time=`date`    #开始时间,使用``替换
sleep 20s            #休眠20秒
finish_time=$(date)  #结束时间,使用$()替换
echo "Begin time: $begin_time"
echo "Finish time: $finish_time"

运行脚本,20 秒后可以看到输出结果:
Begin time: 2019年 04月 19日 星期五 09:59:58 CST
Finish time: 2019年 04月 19日 星期五 10:00:18 CST
#!/bin/bash
begin_time=`date +%s`    #开始时间,使用``替换
sleep 20s                #休眠20秒
finish_time=$(date +%s)  #结束时间,使用$()替换
run_time=$((finish_time - begin_time))  #时间差
echo "begin time: $begin_time"
echo "finish time: $finish_time"
echo "run time: ${run_time}s"

运行脚本,20 秒后可以看到输出结果:
begin time: 1555639864
finish time: 1555639884
run time: 20s

三.字体颜色

字颜色:30—–37 
  echo -e “\033[30m 黑色字 \033[0m” 
  echo -e “\033[31m 红色字 \033[0m” 
  echo -e “\033[32m 绿色字 \033[0m” 
  echo -e “\033[33m 黄色字 \033[0m” 
  echo -e “\033[34m 蓝色字 \033[0m” 
  echo -e “\033[35m 紫色字 \033[0m” 
  echo -e “\033[36m 天蓝字 \033[0m” 
  echo -e “\033[37m 白色字 \033[0m” 
Shell 学习笔记(持续)_第1张图片
字背景颜色范围:40—–47 
  echo -e “\033[40;37m 黑底白字 \033[0m” 
  echo -e “\033[41;37m 红底白字 \033[0m” 
  echo -e “\033[42;37m 绿底白字 \033[0m” 
  echo -e “\033[43;37m 黄底白字 \033[0m” 
  echo -e “\033[44;37m 蓝底白字 \033[0m” 
  echo -e “\033[45;37m 紫底白字 \033[0m” 
  echo -e “\033[46;37m 天蓝底白字 \033[0m” 
  echo -e “\033[47;30m 白底黑字 \033[0m”

Shell 学习笔记(持续)_第2张图片

四.if 判断

Shell if else语句(详解版)

#!/bin/bash

read a
read b

if (( $a == $b ))
then
    echo "a和b相等"
fi

# ===========================
if  condition
then
    statement(s)
fi

## 或者这样,多了一个 ;
if  condition;  then
    statement(s)
fi

五.case 判断

Shell case in语句详解 - zhouyuqiang - 博客园

#!/bin/bash
printf "Input integer number: "
read num
case $num in
    1)
        echo "Monday"
        ;;
    2)
        echo "Tuesday"
        ;;
    3)
        echo "Wednesday"
        ;;
    4)
        echo "Thursday"
        ;;
    5)
        echo "Friday"
        ;;
    6)
        echo "Saturday"
        ;;
    7)
        echo "Sunday"
        ;;
    *)
        echo "error"
esac

# ============================
# 总结起来就是
case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    # ……
    *)
        statementn
esac

你可能感兴趣的:(Makefile,&,Shell,shell)