shell脚本编程(二)
https://blog.csdn.net/xiaochenXIHUA/article/details/156656425?spm=1001.2014.3001.5501
一、变量与配置
1.1、环境变量基础
|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 说明 |
| 1 | bash #定义环境变量 ENVIRON-VARIABLE=value #环境变量赋值 export ENVIRON-VARIABLE #声明环境变量 |
| 2 | 清除环境变量同样是【unset】命令(unset 环境变量名)。 |
| 3 | 【env】命令可以列出已经定义的环境变量。 |
| 4 | 查看环境变量内容 bash #查看环境变量内容命令 echo $环境变量名 |
| 5 | bash #常见系统环境变量 #1-记录了一系列的目录列表,shell为每个输入命令搜索PATH中的目录列表 PATH #2-记录当前用户的根目录 HOME #3-记录当前的目录路径,当利用cd命令改变当前目录时,系统自动更新PWD的值 PWD #4-记录旧的工作目录,即用户所处的前一个目录 OLDPWD #5-SHELL变量保存缺省shell,缺省的值为/bin/bash SHELL #6-默认的解释器 BASH #7-系统默认的语言编码格式 LANG #8-系统当前的用户名称 USER #9-系统当前的主机名称 HOSTNAME #10-USER和UID是保存用户信息的环境变量,USER表示已登录用户的名称,UID表示已经登录用户的ID USER UID #11-PPID是创建当前进程的进程号(即当前进程的父进程号) PPID #12-PS1和PS2是提示符变量,用于设置提示符格式 #PS1是用于设置一级shell提示符的环境变量(也称为主提示符字符串)PS1的变量是 [\u@\h \W]\$ 表示特定的含义: #【\u】表示当前用户名;【\h】表示主机名;【\W】表示当前目录名;【\$】表示若是root用户则显示#号,若是其他用户则显示$号 PS1 PS2 |
| 6 | 《1》环境变量可以在命令行中设置,但用户注销时这些值将丢失。 《2》环境变量均为大写。 《3》必须用export命令导出 |
[环境变量]

1.2、重要的配置文件
【$HOME/.bash_profile】是最重要的配置文件,当某Linux用户登录时,shell会首先执行系统默认的配置文件【/etc/profile】,然后会自动执行【.bash_profile】文件,若.bash_profile文件不存在,则接着读取【~/.bashrc】文件。
若要使新加入的行立即生效,需要利用source命令执行【.bash_profile】文件;source命令也被称为"点命令"(即:句点符号【.】);source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
bash
#让修改的用户自己的配置文件立即生效命令:
#方法一:
source .bash_profile
#方法二:将source替换为句号【.】句号后面用空格与文件名称分隔
. .bash_profile
初始化环境变量文件的顺序是【全局环境变量(/etc/profile)】-->【用户个人环境变量(~/.bash_profile)】-->【用户个人环境变量(~/.bashrc)】-->最后是【/etc/bashrc】如下图所示:


1.3、位置参数变量
位置参数(positional parameters)是一种特殊的shell变量,用于从命令行向shell脚本传递参数。
bash
#位置参数变量
#1-【$0】表示脚本的名字
#2-【$1】表示第一个参数
#3-【$2】表示第二个参数
#4-从【${10}】开始,参数号需要用大括号括起来(如:${10}、${11}、${100}、。。。)
位置参数的用途如下:
《1》从shell命令/脚本的命令行接受参数;
《2》在调用shell函数时为其传递参数。
1.4、内部参数变量
|--------|---------|--------------------------------------------|
| 序号 | 符号 | 说明 |
| 命令行相关参数变量 |||
| 1 | **@** | 表示传递给脚本或函数的所有参数。被双引号(" ")包含时,与【*】稍有不同 |
| 2 | \*** | 表示传递给脚本或函数的所有参数 |
| 3 | **0 | 命令行上输入的shell程序名称 |
| 4 | #** | 表示命令行上参数的个数 |
| 【*】与【@】都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以【"1" "2" "3" ... "n" 】的形式输出所有参数。 **但是当它们被双引号(" ")包含时:** 《1》【"*"】会将所有的参数作为一个整体,以【"1 2 3 ... n"】的形式输出所有参数。 《2》【"@"】会将各个参数分开,以【"1" "2" "3" ... "n" 】的形式输出所有参数。 |||
| |||
| **进程状态相关参数变量** |||
| 1 | **? | 表示上一条命令执行后的返回值: 《1》0:表示成功。 《2》1-255:表示不成功。 |
| 2 | $$ | 表示当前进程的进程号 |
| 3 | !** | 显示运行在后台的最后一个作业的PID |
| 4 | **_ | 在此之前执行的命令或脚本的最后一个参数 |
| |||
| IFS变量 |||
| shell脚本中的【IFS】(Internal Field Seprator)内部字段分隔符,默认值是【空白】(包含:空格、tab和新行) |||
| bash #直接输出IFS是看不到的,需要将它转化为八进制【040】表示空格,【011】表示tab,【012】表示换行符"\n" echo $IFS echo "$IFS"|od -b 【\*】与【@】的区别: 《1》【\*】会根据IFS的不同来组合值,而【@】则会将值用" "来组合值。 《2》推荐使用【@】而不是【*】。 |||
[内部参数变量]
bash
#内部参数变量示例
#1-创建内部参数变量的示例脚本
vi posparametertest.sh
#【posparametertest.sh】脚本的完整内容
#!/bin/bash
#Auth:coffeemilk
#SciptName:posparametertest.sh
#Desc:
echo "【$USER】你好,如下是测试【位置参数变量】的内容:"
echo "脚本名称是:$0"
echo "脚本的第一个参数是:$1"
echo "脚本的第二个参数是:$2"
echo "脚本的第十个参数是:${10}"
echo "你输入的所有参数是:$@"
echo "你输入的所有参数是:"$*""
echo "你输入参数的总个数:$#"
echo "这个脚本的进程ID是:$$"
echo "这个脚本的执行结果:$?"
#2-执行脚本【posparametertest.sh】
bash posparametertest.sh aa bb cc "coffee milk " dd ee ff gg hh iii jjjkkk

1.5、返回与退出状态
|--------|----------|-------------------------------------------------------------------------------------------------|
| 序号 | 符号 | 说明 |
| 1 | **?** | **用于返回上一条语句或脚本执行的状态**: 《1》0:表示成功; 《2》1:通用错误; 《3》126:命令或脚本没有执行权限; 《4》127:命令没有找到; 《5》1-255:表示不成功。 |
| 2 | **exit** | **用于退出脚本或当前shell。** |
| 2 | **exit** | ```bash #exit命令的语法 exit n ``` 《1》【n】是一个从0到255的整数。 《2》【0】表示成功退出,非零表示遇到某种失败。 《3》返回值被保存在状态变量【?】中。 |
[返回与退出状态]
1.6、命令的替换
bash
#命令的替换有如下两种方式:
#替换方法一【`需执行的命令`】
echo `netstat -antlp`
#替换方法二【$(需执行的命令)】
echo $(netstat -antlp)

二、让变量获取键盘输入的内容
bash
#让变量获取键盘输入的内容语法【read [-p "信息"] [var1 var2 ...]】
#若省略变量名,则将输入的内容存入REPLY变量
#1-直接让变量获取键盘输入的内容
read myname
#2-让变量获取键盘输入的内容,且让输入的内容有提示:
read -p "请输入一个0-9的数字:" num
#3-直接获取键盘输入的内容
read
#4-直接获取键盘输入的内容,且让输入的内容有提示
read -p "请输入一个描述:"
#5-直接让变量获取键盘输入的多个值
read name work
read -p"请输入你的姓名 年龄 性别:" name age sex



三、使用declare声明变量
bash
#使用shell内置的命令declare声明变量
#1-declare声明变量的语法【declare [选项] variable=value】
|--------|---------------|-----------------------------|
| shell中的内置命令【declare】声明变量的语法【declare [选项] variable=value】 |||
| 序号 | declare选项 | 说明 |
| 1 | -r | 将变量设置为只读(readonly) |
| 2 | -x | 将变量输出到子shell中(export 为全局变量) |
| 3 | -i | 将变量设置为整型(integer) |
| 4 | -a | 将变量设置为一个数组(array) |
| 5 | -f | 列出函数的名字和定义(function) |
| 6 | -F | 只列出函数名称 |
[shell中的内置命令declare声明变量]
bash
#declare的使用示例
#1-声明只读变量并赋值
declare -r desc="这是一个只读内容测试"
declare desc="只读"
#2-将变量输出到shell中
env | grep "DB_HOST"
declare -x DB_HOST="127.0.0.1"
env | grep "DB_HOST"
#2.1-取消输出到shell中的变量
declare +x DB_HOST
env | grep "DB_HOST"
#3-将变量设置为整型
declare -i age=29
#4-将变量设置为一个数组
declare -a friuts=("苹果" "香蕉" "橙子" "草莓" "猕猴桃")
#4.1-输出数组的所有内容
echo ${friuts[@]}
#4.2-获取数组中的单个值
echo "${friuts[0]}_${friuts[1]}_${friuts[2]}_${friuts[3]}"



