shell环境变量

阅读数:57 评论数:0

跳转到新版页面

分类

Linux

正文

一、env命令

在 Linux 中,env 命令用于显示当前用户的环境变量,或者在修改了环境的情况下执行另一个程序。

1、显示所有环境变量

要打印出当前的所有环境变量及其值,你只需在终端中输入 env 并按下回车键:

env

这将列出所有的环境变量,例如 PATHHOMEUSER 等。

2、使用env执行命令

env 还可以用来在修改了环境的情况下执行命令。例如,如果你想在不改变当前 PATH 环境变量的情况下执行程序,可以使用 env

env PATH=/some/other/directory command

这将只为 command 的执行修改 PATH,不影响当前 shell 或其他程序。

3、清除所有环境变量后执行命令

如果你想清除所有环境变量后执行一个命令(这意味着在一个“干净”的环境中执行它),可以使用 -i 选项:

env -i command

这将执行 command 而不设置任何环境变量。

4、设置特定变量并执行命令

你还可以设置或修改一个或多个环境变量,并立即执行一个命令,而不影响当前 shell 的环境:

env VAR1=value1 VAR2=value2 command

这将在设置了 VAR1 和 VAR2 两个环境变量之后执行 command

5、使用env寻找命令的路径 

env 也经常被用来在脚本中找到某个命令的完整路径。这是因为 env 会在 PATH 环境变量指定的目录中查找命令:

#!/usr/bin/env python

这行通常用在脚本文件的首行,告诉系统使用 env 来查找 python 的路径,这样无论 python 安装在什么位置,脚本都可以正确执行。

二、set命令

在 Linux 中,set 命令是 shell 内置命令,用于设置和查看 shell 的内部参数和环境变量。此外,它也允许你更改 shell 的行为。

1、查看所有变量和函数

当你在没有任何选项的情况下运行 set 命令时,它会显示当前 shell 环境中定义的所有变量(包括环境变量和 shell 变量)和函数。

set

这个列表可能会很长,因为它包含了大量的内部变量和环境变量。

2、设置shell选项

set 命令可以用来开启或关闭 shell 的某些选项。例如,使用 -o 选项可以设置更具体的 shell 行为。

开启 shell 的 noclobber 选项(防止覆盖已存在的文件):

set -o noclobber

关闭 noclobber 选项:

set +o noclobber

3、设置位置参数

set 命令还可以用来设置位置参数($1, $2, ...),这些参数通常是脚本或函数接收的参数。

set -- value1 value2 value3

之后,\$1 的值将是 value1\$2 的值将是 value2,依此类推。

4、使用set命令的-x和-v选项

set -x 命令用于调试,它会在命令执行前打印该命令:

set -x

set -v 命令也用于调试,它会在读取输入行时打印该行:

set -v

5、保存和恢复shell选项

set 命令的输出可以被用来保存当前的 shell 选项,并在以后恢复它们:

# 保存当前的 shell 选项和环境
current_settings=$(set +o)

# ... 在这里做一些改变 ...

# 恢复原来的 shell 选项和环境
eval "$current_settings"

三、语系变量

在 Linux 系统中,语系变量(locale variables)是用来定义用户的语言、国家和字符编码设置的环境变量。这些设置决定了如何显示日期、时间、货币格式,如何比较和排序字符串,以及程序如何响应用户的语言习惯。

以下是一些主要的语系变量:

  • LANG:这个变量用来设置默认的系统语言,其他未设置的语系变量会继承这个值。
  • LANGUAGE:这个变量用来设置在多语言环境中优先使用的语言列表。
  • LC_CTYPE:定义字符处理的方式,比如字符分类和字符串比较,这会影响字符的输入和显示。
  • LC_NUMERIC:定义数字的格式,比如小数点和千分位分隔符。
  • LC_TIME:定义时间的显示格式。
  • LC_COLLATE:定义字符串比较的规则,这会影响排序。
  • LC_MONETARY:定义货币格式,包括货币符号、货币单位和正负数的显示格式。
  • LC_MESSAGES:定义本地化消息的语言,包括系统响应信息、警告、错误和状态信息。
  • LC_ALL:这个变量会覆盖所有其他的 LC_ 变量的设置。

要查看当前的语系设置,可以使用以下命令:

locale

如果你想改变特定的语系设置,可以通过在命令行中导出相应的环境变量来实现。例如,要将系统语言设置为美国英语,可以使用:

export LANG=en_US.UTF-8

要永久改变语系设置,可以在用户的 .bashrc.profile 或系统级别的配置文件(如 /etc/environment 或 /etc/locale.conf)中设置这些变量。

如果你需要生成一个新的语系设置,可以使用 locale-gen 命令。例如,生成美国英语(UTF-8 编码)的语系:

sudo locale-gen en_US.UTF-8

然后你可以重新配置语系,使新的设置生效:

sudo dpkg-reconfigure locales

请注意,上述命令和文件路径可能会根据不同的 Linux 发行版而有所不同。

四、read命令

在 Linux shell 脚本中,read 命令用于从标准输入(键盘)或其他文件描述符中读取数据。默认情况下,它从键盘读取输入,并将读入的值存储在变量中。

以下是 read 命令的一些常见用法:

1、读取单个值

read variable_name
echo "You entered: $variable_name"

当运行上述脚本时,它会暂停并等待用户输入。用户输入的文本在按下 Enter 键后被赋值给 variable_name 变量。

2、读取多个值

read -p "Enter name, age, and gender: " name age gender
echo "Name: $name, Age: $age, Gender: $gender"

这里,read 命令使用 -p 选项来显示提示信息。用户输入的数据应该用空格分隔,这样 read 命令会按顺序将它们赋值给 nameage 和 gender 变量。

3、静默读取(不回显输入)

read -s -p "Enter your password: " password
echo
echo "Password is: $password"

-s 选项使 read 在读取输入时不在终端上显示字符,这对于敏感信息(如密码)的输入非常有用。输入完成后,通常会添加一个额外的 echo 命令来输出一个新行,因为 -s 选项会阻止 read 在输入完成后自动输出新行。

4、定时读取

read -t 5 -p "Enter your name (will timeout after 5 seconds): " name
echo "Name: $name"

-t 选项后面跟的数字指定了 read 等待输入的秒数。如果用户没有在指定时间内输入,read 命令将失败,并且变量 name 将不会被赋值。

5、从文件中读取

while read line; do
  echo "Line: $line"
done < input_file.txt

这个循环使用 read 命令逐行读取 input_file.txt 文件的内容,并将每行的内容赋值给变量 line

6、读取数组

read -a array
echo "First element: ${array[0]}"
echo "All elements: ${array[@]}"

-a 选项指定 read 命令将输入的数据读取到一个数组变量中。用户输入的每个单词(以空格分隔)将成为数组的一个元素。

五、declare命令

在 Bash shell 中,declare 或 typeset 内置命令用于声明 shell 变量和为它们设置属性。这些命令通常在函数中使用,以确保变量的作用域限制在局部环境中,但也可以用来设置全局变量的属性。

以下是 declare 命令的一些常见用法:

1、声明变量

declare variable_name

这将声明一个变量 variable_name,但不会给它赋值。

2、声明并赋值

declare variable_name=value

这将声明一个变量 variable_name 并给它赋值。

3、声明整数变量

declare -i number
number=1+1
echo $number  # 输出 2

选项 -i 告诉 Bash 把变量 number 当作整数来处理。

4、声明只读变量

declare -r PI=3.14

选项 -r 使变量 PI 成为只读,赋值之后就不能更改了。

5、声明数组

declare -a indexed_array

选项 -a 声明一个索引数组。

6、声明关联数组

declare -A associative_array

选项 -A 声明一个关联数组(即字典)。

7、声明并导出变量

declare -x variable_name=value

选项 -x 声明一个环境变量,并将其导出到子进程。

8、列出声明的变量

declare -p  # 列出所有声明的变量及其属性

9、使用declare限制变量作用域

在函数内部使用 declare 声明的变量默认是局部变量,这意味着它们在函数外部不可见。

myfunc() {
  declare local_var="I'm local"
  echo $local_var
}

myfunc  # 输出 "I'm local"
echo $local_var  # 不输出任何内容,因为 local_var 在函数外部不可见

六、typeset命令

在 Bash shell 中,typeset 命令与 declare 命令几乎相同,它们都用于声明变量并设置或修改变量的属性。typeset 是 Korn shell(ksh)中的原始命令,而 Bash 为了兼容性也支持 typeset。在 Bash 中,declare 是推荐使用的命令,因为它是 Bash 的内置命令,而 typeset 被认为是为了与老版本的 shell 脚本兼容而保留的。

typeset 命令的用法与 declare 非常相似,可以用来声明静态变量、整数、数组、关联数组等,并可以设置变量的作用域为局部或全局。

以下是 typeset 的一些用法:

1、声明变量

typeset variable_name

2、声明整数变量

typeset -i number

3、声明只读变量

typeset -r PI=3.14

4、声明数组

typeset -a indexed_array

5、声明关联数组

typeset -A associative_array

6、声明并导出变量

typeset -x variable_name=value

7、列出声明的变量

typeset -p

与 declare 类似,如果在函数中使用 typeset 声明变量,那么这些变量将是局部变量,只在函数内部有效。

myfunc() {
  typeset local_var="I'm local"
  echo $local_var
}

myfunc  # 输出 "I'm local"
echo $local_var  # 不输出任何内容,因为 local_var 在函数外部不可见

在现代的 Bash 脚本中,推荐使用 declare 而不是 typeset,因为 declare 更具有 Bash 风格,并且它提供了一些 typeset 没有的额外功能。然而,如果你需要编写兼容 Korn shell 或其他老版 shell 的脚本,那么使用 typeset 可能是必要的。




相关推荐

一、概述 在 Linux 内核中,__setup 宏和 early_param 宏是用于设置内核启动参数(也称为内核命令行参数)的处理函数的。这些参数在系统启动时由引导加载程序(比如 GRUB)传递给

一、概述 在 Linux 内核编程中,DECLARE_COMPLETION 是一个宏,用于声明并初始化一个 completion 结构体,这个结构体用于同步机制,允许一个进程等待另一个进程的信号。 D

一、概述 在Linux内核中,__setup宏用于定义内核启动时处理特定内核启动参数(也称为命令行参数)的函数。当内核启动时,它会解析传递给它的命令行参数,这些参数可以用来控制内核的行为和配置。 _

一、概述 在Linux内核中,smp_setup_processor_id 函数是在系统引导期间,特别是在多处理器系统中用于设置当前处理器ID的函数。这个函数在早期的系统初始化代码中调用,其目的是确定

一、概述 在Linux环境下,pthread_rwlock_t 是一个用于实现读写锁的数据类型,它属于POSIX线程(pthreads)库。读写锁允许多个线程同时读取共享数据,但是如果一个线程想要写入

osix线程属性pthread_attr_t主要包括: (1) scope属性 表示线程间竟争CPU的范围, PTHREAD_SCOPE_SYSTEM表示与系统中所有线程一起竞争CPU时间, PTHR

一、概述 一般情况下,bash支持一维索引数组和关联数组。 二、定义数组 1、索引数组 #方法一 array=() #定义一个空数组 array1[0]=a array1[1]=b array1[2

一、概述 1、为什么Linus不使用GPLv3 在 PC 上,只要你得到了某个程序的源代码,就可以自行编译生成二进制程序,然后替换掉原有的二进制程序,你的程序自由很容易得到保证。然而 iPod、iPh

说明:这种方式只是用于方便阅读代码,因为可以在源代间快速索引跳跃。但是最后可能会有一些warning,可以不必关心,如果是强迫症,可以使用下面这种方式来去掉。

一、概述 在Linux系统中,/usr/bin和/usr/local/bin是两个常见的目录,用于存放可执行文件(二进制文件)。 很多应用都安装在/usr/local下面,先看一下automake工具