Linux命令和Shell命令的区别
Shell翻译成壳的意思,它是包裹在Linux内核外层的,一个通过一些列的Linux命令对操作系统发出相关指令的人机界面。Shell可以通过其条件语句和循环语句等,把一些列Linux命令结合在一起,形成一个相当于面向过程的程序,即 Shell Script,来实现一些较为复杂的功能。
总括,Shell是Linux命令的概称,是属于命令行的人机界面。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令指令语言,也是一种面向过程的程序设计语言。
0. hello word
#!/bin/bash
#
# Author: yonglong.wyl
# Data: 2021/06/02
# Email: yonglong.wyl@alibaba-inc.com
# 参考:https://www.runoob.com/linux/linux-shell-variable.html
# first hello world, save file as "hello.sh"
echo "Hello World!"
# chmod +x ./hello.sh #添加权限
# ./hello.sh #执行脚本
1. 变量
# 1.1 定义变量,不添加$,引用变量添加$
your_name="yonglong.wyl"
#1.2.1 引用变量:$+变量名
echo $your_name
# 1.2.2 引用变量:$+{变量名}
echo "my name: ${your_name}"
# 1.3 变量重新赋值
your_name="longmang"
# 1.3.1 定义只读变量不可以重新赋值
readonly my_url="https://www.runoob.com"
# my_url="https://www.baidu.com" # 运行脚本出错:This variable is read only.
# 1.4 删除变量:unset 变量名
var_name="will delete"
echo $var_name
unset var_name
echo $var_name #什么都打印不出来
# 1.5 变量类型:局部变量、环境变量、shell变量
# 1.5.1 局部变量(local variable):local 变量名
function fun_a(){
local a=99
b=100
}
fun_a # 调用变量
echo $a # 什么都没输出,函数外无定义,无内容输出
# 1.5.1.1 不使用local 关键字限制,变量作用域也是全局的
echo $b # 输出:100
1.5.2 全局变量
- 所谓全局变量,就是指变量在当前整个shell进程中都有效。
- shell中定义的变量,默认就是全局变量。
- 全局变量的作用域是当前shell进程,而不是当前的shell文件。新开终端窗口就是新的进程
文件:a.sh
#!/bin/bash
echo $a
b=200
文件:b.sh
#!/bin/bash
echo $b
Shell窗口运行:
a=99
./a.sh # 99
./b.sh # 200
三条命令都在一个shell进程中执行,在命令行定义的a,在a文件中可以打印出来99,在a文件中定义的变量b,在运行b文件时可以打印出来,变量的作用域范围已经超出了文件范围
1.6 环境变量
全局变量只在当前shell进程中有效,如果使用 export
命令将全局变量到处,那么它就在所有的子进程中也有效了,称为“环境变量”。
由此可见,变量作用域范围:环境变量 > 全局变量 > 局部变量
a=22 # 定义一个全局变量a
echo $a # 在当前Shell中输出a,成功:22
bash # 进入Shell子进程
echo $a # 在子进程中输出a,失败:无结果
exit # 退出Shell子进程,返回上一级Shell
export a # 将a导出为环境变量
bash # 开启并进入一个新子进程
echo $a # 在子进程中再次输出a,成功:22 ## 默认的系统Shell命令配置中定义了很多环境变量,所以在进入时就具有了环境变量的值
exit #退出子进程
默认的系统Shell命令配置中定义了很多环境变量,所以在进入时就具有了环境变量的值
2. 字符串
# 定义字符串可以单引号,也可以双引号
str1='this is a string'
str2="this is an another string"
# 单引号的任何字符都会原样输出,单引号字符串中的变量是无效的
echo 'str1:${str1}'
# 双引号里可以有变量
echo "str1:${str1}"
# 双引号里可以出现转义字符
echo "str1:\"$str1\" \n"
# 计算变量字符长度
echo "your_name length: ${#your_name}"
# 字符串截取/提取
echo "subStr1,4: ${your_name:1:4}"
#查找子字符串
echo `expr index ${str1} i` # 输出2
3. 数组
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
定义数组用括号来表示,数组元素用 空格
符号来分隔
# 定义数组,元素之间使用空格分隔
array_name=(a "b" c) # 字符是否使用引号都可
# 引用数组元素
echo $array_name[0] #输出:a
# 显示所有数据元素,使用: @ or *
echo ${array_name[@]} #输出:a b c
echo ${array_name[*]} #输出:a b c
# 显示数据长度
echo ${#array_name[@]} #输出:3
echo ${#array_name[*]} #输出: 3
# 取得单个元素的长度
echo ${#array_name[0]} #输出:1
4. 注释
4.1 #
开头就是注释,会被解释器忽略
#--------------------------------------------
# 这是一个注释
# author:菜鸟教程
# site:www.runoob.com
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束 #####
4.2 多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
# :<< + 单引号
:<<'
注释内容...
注释内容...
注释内容...
'
# :<< + 叹号
:<<!
注释内容...
注释内容...
注释内容...
!