shell环境变量
阅读数:95 评论数:0
跳转到新版页面分类
Linux
正文
一、env命令
在 Linux 中,env
命令用于显示当前用户的环境变量,或者在修改了环境的情况下执行另一个程序。
1、显示所有环境变量
要打印出当前的所有环境变量及其值,你只需在终端中输入 env
并按下回车键:
env
这将列出所有的环境变量,例如 PATH
、HOME
、USER
等。
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
命令会按顺序将它们赋值给 name
、age
和 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
可能是必要的。