shell变量的分类及定义

本文详细介绍了Shell变量的分类,包括环境变量(全局变量)和普通变量(局部变量)。环境变量对shell运行环境至关重要,如定义用户名、命令路径等,并可以通过.bash_profile等文件持久化。普通变量仅限于其所在的函数或脚本中使用。设置环境变量通常使用export命令,而打印或删除变量则分别用echo、unset。Shell变量名由字母、数字、下划线组成,以字母或下划线开头。

shell变量的类型:

shell变量分环境变量(全局变量)和普通变量(局部变量)

环境变量亦称为全局变量,可以在建立它们的shell及其派生出来的任意子进程shell中使用;环境变量又分为自定义环境变量和Bash内置的环境变量。

普通变量亦称为局部变量,只能在创建它们的shell函数或shell脚本中使用,一般由开发者用户创建。

环境变量的作用:一般用于定义shell的运行环境,保证shell命令的正确执行,Shell通过环境变量来确定登陆用户名,命令路径,终端类型,登陆目的等。

环境变量的创建:可以在命令行中设置创建,但用户退出命令行时这些变量值就会丢失,因此,若希望永久保存环境变量,可在用户家目录下的 .bash_profile 或者 .bashrc 文件中或全局配置 /etc/bashrc 或 /etc/profile 文件或 /etc/profile.d/ 中定义。将环境变量放在这些文件中,每次用户登陆时这些变量值都会被初始化一次。

一般,环境变量都为大写,使用export命令导出定义环境变量

内置的环境变量,如HOME, PATH, SHELL, UID,USER,HOSTNAME 等,都是在用户登陆之前就已经被/bin/login程序设置好了。

自定义的环境变量: 如果想要设置环境变量,就要在给变量赋值之后或设置变量时使用export命令。带-x选项的declare内置命令也可以完成同样的功能。(注意:输出变量时不要在变量名前加$)

自定义环境变量的设置方法:
<1> export 变量名=value

[root@localhost SHELL]# export NAME=nihao
[root@localhost SHELL]# env | grep NAME
HOSTNAME=localhost.localdomain
NAME=nihao    //设置成功,但是此种方式不能永久生效
USERNAME=root
LOGNAME=root
[root@localhost SHELL]# 

要想让其生效必须将其放在用户的环境变量( .bashrc.bash_profile )或者全局的环境变量( /etc/profile 或 /etc/bashrc 或 /etc/profile.d )

<2> 变量名=value : export 变量名

<3> declare -x 变量名=value (很少用)

对环境变量的操作:

<1>用echo或者printf打印环境变量(注意:输出环境变量时,要加$符号)

[root@localhost SHELL]# echo $USER
root
[root@localhost SHELL]# printf $HOME
/root[root@localhost SHELL]# printf "$HOME\n"
/root
[root@localhost SHELL]# 

$HOME  用户登陆时进入的目录
$UID   当前用户的UID(用户标识)相当于 id-u
$PWD   当前工作目录的绝对路径名
$SEHLL  当前shell
$USER   当前用户

<2>用env(printenv) 或者set显示环境变量
一般不用set,set的显示比较乱

[root@localhost SHELL]# env
XDG_VTNR=1
XDG_SESSION_ID=1
DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-MQJKrUWfi8,guid=5a9152fe944f715e8f75d17d5868e73d
GPG_AGENT_INFO=/run/user/0/keyring-LQZGWn/gpg:0:1
VTE_VERSION=3406
XDG_MENU_PREFIX=gnome-
SHELL=/bin/bash
TERM=xterm-256color
WINDOWID=33554438
GNOME_KEYRING_CONTROL=/run/user/0/keyring-LQZGWn
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root

<3>用unset消除本地变量或环境变量(unset 时不用加$符号)

[root@localhost SHELL]# export NAME=MMMMM    //设置环境变量
[root@localhost SHELL]# env | grep NAME      //查找环境变量NAME
NAME=MMMMM
USERNAME=root
LOGNAME=root
[root@localhost SHELL]# unset NAME          //删除环境变量
[root@localhost SHELL]# echo $NAME          //打印环境变量,没有输出,说明删除环境变量成功

[root@localhost SHELL]# 

普通变量的定义:

变量名=value

直接定义变量内容的方法;输出变量内容时会将变量内容里的变量或命令(要反引下)解析之后再输出,一般为简单连续的数字,字符串,路径名等,如果内容中有空格等特殊字符,则不能完整输出,需要改加双引号

[root@localhost SHELL]# d=123456
[root@localhost SHELL]# c="192.168.1.2-$d"
[root@localhost SHELL]# c=192.168.1.2-$d
[root@localhost SHELL]# echo $c
192.168.1.2-123456
[root@localhost SHELL]# 

//变量内容中有命令要反引下 反引符号为 ``
[root@localhost SHELL]# d=123456
[root@localhost SHELL]# c="192.168.1.2-$d"
[root@localhost SHELL]# c=192.168.1.2-$d
[root@localhost SHELL]# echo $c
192.168.1.2-123456
[root@localhost SHELL]# c=192.168.1.2-$`echo $d`
[root@localhost SHELL]# echo $c
192.168.1.2-$123456
[root@localhost SHELL]#

变量名=’value’

通过单引号定义变量;输出变量内容时单引号里面是什么就输出什么,即使内容中有变量和命令也会将它们原样输出。

变量名=”value”

通过双引号定义变量,输出变量时引号里的变量及命令(要反引下)会经过解析后才输出该变量的内容,而不是将引号中的变量或命令原样输出。

shell中变量名及变量内容的要求:

变量名 一般是由字母,数字,下划线组成。一般以字母或下划线开头,但是数字不可以。

变量名的输出:

$变量名表示变量输出,使用$变量名 或者 ${变量名} 是等同的。

[root@localhost SHELL]# a=192.168.1.2
[root@localhost SHELL]# echo $a
192.168.1.2
[root@localhost SHELL]# b='192.168.1.2'
[root@localhost SHELL]# echo $b
192.168.1.2
[root@localhost SHELL]# c="192.168.1.2"
[root@localhost SHELL]# echo $c
192.168.1.2
[root@localhost SHELL]# echo "a=$a"
a=192.168.1.2
[root@localhost SHELL]# echo "b=$b"
b=192.168.1.2
[root@localhost SHELL]# echo "c=${c}"
c=192.168.1.2
[root@localhost SHELL]# export NAME=MMMMM
[root@localhost SHELL]# echo "${NAME}"
MMMMM
[root@localhost SHELL]# 

连续普通字符串赋值给变量,不管是否使用了引号(单引号或双引号),内容是什么,就会打印出什么

但是当不是连续的普通字符串时:
[root@localhost SHELL]# a=192.168.1.2-$a
[root@localhost SHELL]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@localhost SHELL]# b='192.168.1.2-$a'
[root@localhost SHELL]# echo "b=$b"
b=192.168.1.2-$a
[root@localhost SHELL]# c="192.168.1.2-$a"
[root@localhost SHELL]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2
[root@localhost SHELL]# echo "c=$c"
c=192.168.1.2-192.168.1.2-192.168.1.2
[root@localhost SHELL]# 

把命令的结果作为变量内容的定义方法

变量名=命令 //命令用反引号包裹
变量名=$(命令)

[root@localhost SHELL]# ddddd=`ls`
[root@localhost SHELL]# echo $ddddd
test1.sh test.sh UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# ls
test1.sh  test.sh  UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# e=$(ls)
[root@localhost SHELL]# echo $e
test1.sh test.sh UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# 
<think> 我们正在讨论的是C Shell中的变量定义方法。根据提供的引用资料,虽然主要针对的是Bash Shell(常见的Shell类型),但我们可以结合C Shell的特性来回答。 注意:C Shell(csh)和Tc Shell(tcsh)是另一种常用的Shell,其语法与Bash等Bourne Shell派生出的Shell有较大差异。 引用[2]和[4]提到了变量定义的基本规则,如变量名不能以数字开头、不能有空格、不能包含特殊符号(除下划线)等,这些规则在C Shell中同样适用。但是,C Shell的语法有所不同。 在C Shell定义变量使用`set`命令(用于普通变量)和`setenv`命令(用于环境变量)。例如: - 定义局部变量:`set var = value` - 定义环境变量:`setenv VAR value` (注意:环境变量名通常大写,且不需要等号) 另外,引用[3]提到了局部变量(在函数内使用`local`关键字),但在C Shell中,函数内的局部变量使用`set local_var = value`,但C Shell并不支持`local`关键字,因此函数内的变量默认是全局的。如果需要在函数内使用局部变量,可以使用`set`命令并在变量名前加上`local`(但这并不是标准做法,实际上C Shell没有内置的局部变量机制,通常使用子shell来实现隔离)。 引用[1]提到变量可以重新赋值,这在C Shell中也适用,同样使用`set`命令重新赋值。 引用[5]提到了三种变量局部变量环境变量shell变量。在C Shell中: - 局部变量(仅当前shell实例有效):使用`set`定义变量。 - 环境变量(对所有子进程有效):使用`setenv`定义变量。 - shell变量:包括一些特殊的内置变量(如`$HOME`, `$PATH`等)。 因此,针对C Shell变量定义,以下是具体方法: 1. 定义局部变量: 语法:`set variable_name = value` 示例:`set name = "John Doe"` 注意:等号两边必须有空格(与Bash不同,Bash不允许空格)。 2. 定义环境变量: 语法:`setenv VARIABLE_NAME value` 示例:`setenv PATH /usr/bin:/bin` 注意:没有等号,变量名和值之间用空格分隔,且环境变量通常大写。 3. 重新赋值: 对于局部变量:`set name = "New Name"` 对于环境变量:`setenv VARIABLE_NAME new_value` 4. 使用变量: 在变量名前加`$`,例如:`echo $name` 5. 变量名规则: - 只能包含字母、数字、下划线,且不能以数字开头(与引用[2]和[4]一致)。 - 不能包含空格或其他特殊字符(如$、*等)。 - 如果值包含空格,必须用引号括起来(单引号或双引号)。 6. 数组(C Shell支持数组,称为列表): 定义:`set array = (value1 value2 value3)` 访问元素:`echo $array[1]` (索引从1开始) 注意:C Shell的语法与Bash有很大不同,例如在赋值时等号两边需要空格,而Bash不允许空格。 由于用户提到的是C Shell,我们需要强调这些区别。 下面是一个综合示例: ```csh #!/bin/csh # 定义局部变量 set local_var = "This is a local variable" echo $local_var # 重新赋值 set local_var = "New value" echo $local_var # 定义环境变量 setenv MY_ENV_VAR "This is an environment variable" echo $MY_ENV_VAR # 数组(列表)定义和使用 set fruits = (apple banana orange) echo "The first fruit is $fruits[1]" ``` 注意:C Shell脚本的文件扩展名通常是`.csh`或`.tcsh`(如果使用tcsh的特性)。 相关问题: 1. C Shell和Bash中变量定义的主要区别是什么? 2. 在C Shell中如何将局部变量转换为环境变量? 3. C Shell中的数组如何操作? </think> ### C Shell变量定义方法详解 在C Shell(csh/tcsh)中,变量定义遵循特定语法规则,与Bash等Shell有所不同。以下是核心定义方法: #### 1. **基本变量定义** 使用`set`命令定义普通变量: ```csh set var_name = value # 等号两边必须有空格 ``` 示例: ```csh set url = "http://example.com" echo $url # 输出变量值 ``` #### 2. **环境变量定义** 使用`setenv`命令定义环境变量(无需等号): ```csh setenv ENV_VAR "global_value" ``` 示例: ```csh setenv PATH "/usr/local/bin:$PATH" # 修改环境变量 ``` #### 3. **变量命名规则** - 以字母或下划线开头:`set _count = 5` - 可包含字母/数字/下划线:`set file_1 = "data.txt"` - **禁止**以下操作: ```csh set 2var = 10 # 错误:数字开头 [^2][^4] set var$ = "x" # 错误:包含特殊符号 [^2] set user name = "Tom" # 错误:包含空格 [^4] ``` #### 4. **特殊值处理** - 空值定义:`set empty_var = ""` - 带空格的值必须用引号: ```csh set msg = "Hello World" # 正确 set msg = Hello World # 错误:空格导致解析失败 [^4] ``` #### 5. **变量作用域** - 局部变量:默认在脚本内部有效 ```csh # 函数内定义局部变量 foreach name (Alice Bob) set local_var = $name echo $local_var end ``` - 全局环境变量:通过`setenv`定义,子进程可继承 [^5] #### 6. **变量操作** - 重新赋值: ```csh set url = "http://site.org" # 覆盖原值 [^1] ``` - 拼接变量: ```csh set path = "/home" set full_path = "${path}/user" ``` ### 注意事项 1. C Shell**不支持**Bash的`local`关键字,替代方案: ```csh (subshell) { # 子shell隔离作用域 set temp = 100 echo $temp } ``` 2. 引用变量时必须用`$`符号:`echo $PATH` 3. 数组需特殊声明:`set arr = (a b c)` > 提示:C Shell与Bash语法差异较大,建议通过`% which csh`确认系统是否安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值