shell变量的定义和类型

本文详细介绍了Shell变量的基础概念,包括变量的定义、使用、类型及特殊属性等,并通过具体示例展示了如何操作环境变量和普通变量。

shell 变量

定义变量

shell在定义变量的时候,变量名与变量之间不能存在空格,这个大多数的语言的这个不同还是蛮大的,不过定义的规则就其他的语言定义的规则大致相同了。

使用变量

使用一个已经定义过的变量,只需要在变量的名字前加$,例如下面的例子。
在使用变量额时候

#!/bin/bash
# filename: test.sh
# 2017-10-22 20:46:42

line="Hello world"
echo $line
# echo ${line} #可以的添加一个{},添加一个边界,更加的醒目,好理解
leeguo@leeguo-PC:~/Nutstore/Shell_code$ sh test.sh
Hello world

只读变量 readonly

在变量的前面 添加readonly把变量定义为一个只能读取的变量,无法进行修改。

name='leeguo'
readonly name
name='idealcitier'
echo ${name}
#output
test.sh: 15: test.sh: name: is read only

删除变量unset

使用unset定义一个变量,变量的内容就被删除了。

name='idealcitier'
unset name
echo ${name}

在运行之后,是没有输出的。

shell变量的类型

和其他的语言中一样,shell中的变量也是分为不同的类型的。
- 全局变量(环境变量)
- 局部变量(普通变量)

全局变量(环境变量)

在Linux中,内置了一些环境变量,如HOME,PATH,SHELL,UID,GID,HOSTNAME等,可以通过命令env显示所有的环境变量。

leeguo@leeguo-PC:~/Nutstore/Shell_code$ echo $HOME
/home/leeguo
定义环境变量

用户也可以根据自己的需要定义自己的环境变量(全局变量),定义环境变量的方法:

export  variable_name=value
#or
variable_name=value
export  variable_name

举个例子:

export NAME=idealcitier
leeguo@leeguo-PC:~/Nutstore/Shell_code$ export NAME=idealcitier
leeguo@leeguo-PC:~/Nutstore/Shell_code$ env | grep NAME
NAME=idealcitier
LOGNAME=leeguo
LC_NAME=zh_CN.UTF-8

可以看出,定义的环境变量,成功了。

对环境变量进行操作
  • 可以使用echo对环境变量进行显示。
    shell
    leeguo@leeguo-PC:~/Nutstore/Shell_code$ echo $NAME
    idealcitier
  • 利用env,显示所有的环境变量。
    shell
    leeguo@leeguo-PC:~/Nutstore/Shell_code$ env
    LC_PAPER=zh_CN.UTF-8
    XDG_VTNR=7
    LC_ADDRESS=zh_CN.UTF-8
    XDG_SESSION_ID=c2
    TERM_PROGRAM=vscode
    LC_MONETARY=zh_CN.UTF-8
    XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/leeguo
    CLUTTER_IM_MODULE=xim
    GIO_LAUNCHED_DESKTOP_FILE_PID=11788
    ...
  • 清除环境变量unset

    leeguo@leeguo-PC:~/Nutstore/Shell_code$ export NAME=idealcitier
    leeguo@leeguo-PC:~/Nutstore/Shell_code$ echo $NAME
    idealcitier
    leeguo@leeguo-PC:~/Nutstore/Shell_code$ unset NAME
    leeguo@leeguo-PC:~/Nutstore/Shell_code$ echo $NAME
    
普通变量

环境变量一般在脚本或命令中进行定义,只在当前的shell中有效,其他启动的shell这个变量是无效的。

variable_name=name

shell字符串

字符串使用单引号''和双引号""

单引号
  • 单引号中所有的字符都是原样的输出,也就是说单引号中的变量是无效的。
  • 单引号中无能再出现单引号了,对转移符也无效
双引号
  • 双引号中可以有变量
  • 可以使用转移符
str='test line'
echo 'It is a $str '

echo "It is a \" $str \""
#output
It is a $str
It is a " test line "
  • 拼接字符串

    your_name="qinjx"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1
  • 获取字符串长度

    string="abcd"
    echo ${#string} #输出 4
  • 提取子字符串

    以下实例从字符串第 2 个字符开始截取 4 个字符:

    string="runoob is a great site"
    echo ${string:1:4} # 输出 unoo
  • 查找子字符串

    查找字符 “i 或 s” 的位置:

    string="runoob is a great company"
    echo `expr index "$string" is`  # 输出 8

shell数组

支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

定义数组

在Shell中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:
数组名=(值1 值2 … 值n)

array_name=(value0 value1 value2 value3)

or

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

读取数组

读取数组元素值的一般格式是:
${数组名[下标]},也就是valuen=${array_name[n]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}
获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

取得数组元素的个数
length=${#array_name[@]}

or

length=${#array_name[*]}
取得数组单个元素的长度
lengthn=${#array_name[n]}

本文参考http://www.runoob.com/linux/linux-shell-variable.html

<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 ShellBash中变量定义的主要区别是什么? 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、付费专栏及课程。

余额充值