使用Shell变量
问题
本案例要求熟悉Shell变量的使用,主要练习或验证下列内容:
1)定义/赋值/查看变量
2)环境/预定义/位置变量的应用
除了学会建立和引用变量以外,还要认识环境变量PWD、USER、HOME、SHELL,还有预定义变量0、0、0、、、、?、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、*,以及位置变量$1、$2、$10、……的作用。
步骤
实现此案例需要按照如下步骤进行。
步骤一:变量的定义/赋值/查看
1)新建/赋值变量
新建变量SCHOOL,赋值“Tarena IT GROUP”,通过set命令可以检查变量设置:
[root@svr5 ~]# SCHOOL="Tarena IT" [root@svr5 ~]# set | grep SCHOOL SCHOOL='Tarena IT'
2)查看变量
通过echo $变量名 可输出变量值:
[root@svr5 ~]# echo $SCHOOL Tarena IT
查看变量时,若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分:
[root@svr5 ~]# echo $SCHOOLGroup //无法识别变量名SCHOOL [root@svr5 ~]# echo ${SCHOOL}Group //区分后可以识别 Tarena ITGroup
3)撤销自定义变量
若要撤销已有的变量,可使用unset命令:
[root@svr5 ~]# unset SCHOOL //撤销变量SCHOOL [root@svr5 ~]# echo $SCHOOL //查看时已无结果 [root@svr5 ~]#
步骤二:使用环境变量
1)查看环境变量相关文件
全局文件为/etc/profile,对所有用户有效;用户文件为~/.bash_profile,仅对指定的用户有效。
查看/etc/profile文件内容:
[root@svr5 ~]# cat /etc/profile .. .. if [ -x /usr/bin/id ]; then USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER" fi HOSTNAME=`/bin/hostname` HISTSIZE=1000 .. .. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC .. .. **查看~/.bash_profile文件内容:** [root@svr5 ~]# cat ~/.bash_profile | grep -v ^$ # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH unset USERNAME
2)使用环境变量
当前用户的环境变量USER记录了用户名、LOGNAME记录了登录名、HOME记录了宿主目录、SHELL记录了登录Shell、HOSTNAME记录主机名、TERM记录终端类型:
[root@svr5 ~]# echo $USER $LOGNAME $HOME $SHELL root root /root /bin/bash [root@svr5 ~]# echo $HOSTNAME svr5.tarena.com [root@svr5 ~]# echo $TERM xterm
环境变量PWD记录了当前所在的路径,而OLDPWD记录了上次执行cd之前所在的路径:
[root@svr5 ~]# cd /boot/grub/ [root@svr5 grub]# echo $PWD $OLDPWD /boot/grub /root //前一次工作目录为/root [root@svr5 grub]# cd - //切换到前一次的工作目录 /root //正确切回/root [root@svr5 ~]# echo $PWD $OLDPWD /root /boot/grub //此时OLDPWD自动设为/boot/grub [root@svr5 ~]# OLDPWD=/usr/src //手动修改OLDPWD值 [root@svr5 ~]# echo $PWD $OLDPWD //确认修改结果 /root /usr/src [root@svr5 ~]# cd - //再次切换前一次目录 /usr/src [root@svr5 src]# pwd //实际进入修改后的/usr/src,而不是/boot/grub /usr/src 56 环境变量PS1表示Shell环境的一级提示符,即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、\$ 权限标识): [root@svr5 src]# echo $PS1 //查看默认的一级提示 [\u@\h \W]\$ [root@svr5 src]#PS1='bash-3.2\$' //修改一级提示 bash-3.2# //更改结果 bash-3.2#PS1='[\u@\h \W]\$ ' //恢复原有设置 [root@svr5 src]# 环境变量PS2表示二级提示符,出现在强制换行、at任务编辑等场合: [root@svr5 ~]# echo $PS2 //查看默认的二级提示 > [root@svr5 src]# cd \ //强制换行,观察提示符效果 > /root/ [root@svr5 ~]# PS2='=> ' //手动修改二级提示 [root@svr5 ~]# cd \ //再次验证提示符效果 => ~ [root@svr5 ~]# PS2='> ' //恢复原有设置
3)查看系统变量
使用env可查看所有环境变量:
[root@svr5 src]# env HOSTNAME=svr5.tarena.com TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.4.110 59026 22 OLDPWD=/root SSH_TTY=/dev/pts/0 USER=root .. .. HOME=/root LOGNAME=root CVS_RSH=ssh SSH_CONNECTION=192.168.4.110 59026 192.168.4.4 22 LESSOPEN=|/usr/bin/lesspipe.sh %s DISPLAY=localhost:10.0 G_BROKEN_FILENAMES=1 _=/bin/env 使用set可查看所有变量(包括env能看到的环境变量): [root@svr5 src]# set BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() .. .. 对比env、set列出的结果数量: [root@svr5 src]# env | wc -l 24 [root@svr5 src]# set | wc -l
**
步骤三:使用位置变量
**
1)创建一个测试脚本,用来展示。
[root@svr5 ~]# vim location.sh #!/bin/bash echo "您输入的第2、11个参数分别是:$2、${11}" [root@svr5 ~]# chmod +x location.sh //添加可执行权限
2)执行脚本location.sh,测试结果。
[root@svr5 ~]# ./location.sh one two three 您输入的第2、11个参数分别是:two、 //$2为two,$11为空 [root@svr5 ~]# ./location.sh a b c d e f g h i j k l m n 您输入的第2、11个参数分别是:b、k //$2为b,$11为k
3)利用位置参数提供2个整数,求和(运算相关知识后续章节详解)
创建求和脚本文件:
[root@svr5 ~]# cat sum2int.sh #/bin/bash echo $[$1+$2] [root@svr5 ~]# chmod +x sum2int.sh //添加可执行权限 测试执行结果: [root@svr5 ~]# ./sum2int.sh 12 //参数不够或异常时报错 ./sum2int.sh: line 2: 12+: syntax error: operand expected (error token is "+") [root@svr5 ~]# ./sum2int.sh 12 34 //输出12+34的结果 46 [root@svr5 ~]# ./sum2int.sh 123 456 //输出123+456的结果 579
步骤四:使用预定义变量
1)变量 $$ 可获得当前所在进程的PID号。
[root@svr5 ~]# echo $$ 9755 [root@svr5 ~]# ps -p 9755 //检查对应PID的进程 PID TTY TIME CMD 9755 pts/0 00:00:00 bash //当前处于bash解释器环境中
2)变量 $! 会记录最近一个后台进程的PID号。
[root@svr5 ~]# sleep 300 & //创建一个后台测试进程(睡眠300秒) [1] 10710 [root@svr5 ~]# echo $! 10710
3)变量 $? 的返回值可用来识别前一条命令是否执行正常。
[root@svr5 ~]# ls -lh /etc/fstab //正常执行一条命令行 -rw-r--r-- 1 root root 733 10-09 15:34 /etc/fstab [root@svr5 ~]# echo $? //检查 $? 的值,为0说明前一条命令成功 0 [root@svr5 ~]# ls -lh /etcfstab //故意写错一条命令 ls: /etcfstab: 没有那个文件或目录 [root@svr5 ~]# echo $? //检查 $? 的值,非0说明前一条命令异常/失败/ 2 4)修改测试脚本location.sh,添加对“位置变量相关的预定义变量”的测试。 编辑脚本内容: [root@svr5 ~]# cat location.sh #!/bin/bash echo "您输入的第2、11个参数分别是:$2、${11}" echo "当前执行的脚本名是:$0 //$0 记录脚本名称 您一共输入了 $# 个位置参数 //$# 记录位置参数个数 它们是:$* " //$* 记录所有位置参数的内容 执行脚本测试: [root@svr5 ~]# ./location.sh one tow 3nd 4th E F g h i j k 您输入的第2、11个参数分别是:tow、k 当前执行的脚本名是:./location.sh 您一共输入了 11 个位置参数 它们是:one tow 3nd 4th E F g h i j k
- linux命令行与shell脚本大全_第五章_使用环境变量
- shell标记技巧 $变量使用
- Shell ${} 变量使用技巧
- shell切换用户EOF下变量的使用[: ==: unary operator expected
- shell切换用户EOF下变量的使用[: ==: unary operator expected
- shell脚本——变量的设置及使用
- 【转载】sed和awk中使用shell变量
- 继续分享shell 之变量使用
- awk使用shell中的变量
- awk中使用shell变量的两种方法
- awk 中使用shell 变量
- shell切换用户EOF下变量的使用[: ==: unary operator expected
- shell切换用户EOF下变量的使用[: ==: unary operator expected
- shell语法之变量的使用
- 继续分享shell 之变量使用
- awk中使用shell变量疑问
- shell 循环中使用管道符的变量问题
- Shell中变量作用域的介绍与使用命令
- 三、变量:shell变量的定义、使用、重命名、只读变量、删除变量、变量类型、特殊变量
- shell简单使用(五)变量之二