SHELL 的环境变量

一、环境变量

  1. 环境变量也可叫全局变量,可以在创建他们的shell及派生出的子shell中使用(无需定义,直接可以使用,如:$UID)
  2. 相关命令:
    set :输出所有变量
    env:只显示全局变量
    declare:输出所有变量,函数,整数等

二、定义变量

[root@server ~]# a=hello
[root@server ~]# echo $a
hello
[root@server ~]# b='hello'
[root@server ~]# echo $b
hello
[root@server ~]# c="hello"
[root@server ~]# echo $c
hello
[root@server ~]# a=westos-$a
[root@server ~]# echo $a
westos-hello
[root@server ~]# b='westos-$a'               ##不转译变量,按原样输出
[root@server ~]# echo $b
westos-$a
[root@server ~]# c="westos-$a"               ##转移变量
[root@server ~]# echo $c
westos-westos-hello
[root@server ~]# a=westos hello              ##定义变量有空格时,要加“”
bash: hello: command not found...
[root@server ~]# a="westos hello"
[root@server ~]# echo $a
westos hello

注意:建议没有特别要求时,字符串都加双引号,需要原样输出就加单引号

三、特殊变量

  1. $0:获取脚本文件名,如果执行时包含路径,则输出脚本路径
  2. $n(>0):(>0):获取脚本的第n个参数
  3. $#:获取脚本后参数的总个数
  4. $*:获取所有参数
  5. $@:获取所有参数
  6. $?:获取上一条命令执行状态的返回值,非0为失败
  7. $$:获取当前shell进程号
$0:
[root@server mnt]# cat westos.sh
#!/bin/bash
echo $0
[root@server mnt]# sh westos.sh
westos.sh
[root@server mnt]# /mnt/westos.sh
/mnt/westos.sh
$n:
[root@server mnt]# cat westos.sh
#!/bin/bash
echo $1 $2
[root@server mnt]# sh westos.sh hello westos
hello westos
[root@server mnt]# sh westos.sh hello redhat
hello redhat
[root@server mnt]# echo \${1..10} > westos.sh
[root@server mnt]# cat westos.sh
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10
[root@server mnt]# sh westos.sh  {1..10}
1 2 3 4 5 6 7 8 9 10
[root@server mnt]# sh westos.sh  {a..z}
a b c d e f g h i a0
[root@server mnt]# sh westos.sh  {a..z}
a b c d e f g h i j
$#:
[root@server mnt]# cat westos.sh ]
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $#
[root@server mnt]# sh westos.sh {1..100}
1 2 3 4 5 6 7 8 9
100

read用法:

[root@server mnt]# read str
westos hello
[root@server mnt]# echo $str
westos hello
[root@server mnt]# read -p "请输入一个整数:" i
请输入一个整数:10

将命令的结果赋值给变量:

[root@server mnt]# CMD=`ls -l`
[root@server mnt]# echo $CMD
total 8 -rwxr-xr-x. 1 root root 492 Dec 22 10:25 test.sh -rwxr-xr-x. 1 root root 40 Dec 22 10:40 westos.sh

[root@server mnt]# CMD=$(ls -l)
[root@server mnt]# echo $CMD
total 8 -rwxr-xr-x. 1 root root 492 Dec 22 10:25 test.sh -rwxr-xr-x. 1 root root 40 Dec 22 10:40 westos.sh


练习打包日志

[root@server mnt]# tar zcf log_$(date +%F).tar.gz /var/log/

### 只读Shell环境变量的定义与使用 #### 定义只读环境变量Shell中,`readonly`命令用于将变量标记为只读。一旦某个变量被声明为只读,它的值就不能再被修改或删除[^1]。为了使该变量成为环境变量,还需要通过`export`命令将其导出到环境中。 以下是创建只读环境变量的具体过程: 1. **定义变量并赋初值** 首先定义一个普通的Shell变量,并为其赋予初始值。 2. **将变量设为只读** 使用`readonly`命令对该变量进行保护,防止后续对其值的任何更改尝试。 3. **导出为环境变量** 利用`export`命令将此变量提升至环境变量级别,使得子进程能够继承它。 示例代码如下: ```bash #!/bin/bash MY_VAR="This is a read-only environment variable" export MY_VAR readonly MY_VAR echo $MY_VAR ``` #### 设置方法注意事项 当试图对已经设定成只读状态下的变量重新分配新数值或者执行清除操作(`unset`)时,系统将会抛出错误提示表明这是不可变更的只读型态数据对象[^1]。 #### 使用场景分析 只读环境变量适用于那些在整个应用程序生命周期内都不应该发生变化的关键配置参数场合。例如,在部署大型分布式应用架构下,某些固定的网络端口号、数据库连接串或者是API密钥等敏感信息都可以考虑采用这种方式加以管理以增强系统的稳定性和安全性[^4]。 另外值得注意的是虽然我们讨论的重点在于“环境”层面的只读特性实现,但实际上无论是局部还是全局作用域内的任意种类别的shell变量均支持利用同样的机制施加类似的限制条件[^3]。 ### 示例演示 下面给出一段完整的脚本来展示整个流程以及验证效果: ```bash #!/bin/bash # Step 1: Define the variable with initial value. DB_HOST="localhost" # Step 2: Export it as an environmental variable so child processes can access it too. export DB_HOST # Step 3: Mark this variable as 'read only'. readonly DB_HOST # Print out current status of our newly created RO env var. echo "Database Host set to: $DB_HOST" # Attempting modification will fail now... DB_HOST="new-host.example.com" && echo "Modified successfully!" || echo "Modification failed due to being READ ONLY!" ``` 运行以上脚本后可以看到最后一步修改失败的信息输出,证明了我们的目标达成情况良好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值