基于linux下的shell变量

匿名 (未验证) 提交于 2019-12-02 21:59:42
变量即在程序运行过程中它的值是允许改变的量,变量是用一串固定的字符 来标志不固定的值的一种方法,变量是一种使用方便的占位符,用于引用计 算机内存地址,该地址可以存储scripts运行时可更改的程序信息。在shell 中变量是不可能永久保存在系统中的,必须在文件中声明。
shell中变量分为环境级变量,用户级变量,系统级变量, 环境级变量只在当前shell中生效,shell关闭变量丢失, 用户级变量写在用户的骨文件中,只针对当前用户有效, 系统级变量被写在系统的配置文件/etc/profile中 变量即在程序运行时保存在内存中。 硬盘永久,内存临时的。
环境级: export A=1 用户级: vim ~/bash_profile export A=1 系统级: vim /etc/profile export  A=1
[root@localhost mnt]# echo $USER root [root@localhost mnt]# a=1 [root@localhost mnt]# ps   父级进程   PID TTY          TIME CMD  2200 pts/1    00:00:00 bash  4833 pts/1    00:00:00 ps [root@localhost mnt]# vim file.sh   加入显示a的值并加入睡眠时间

[root@localhost mnt]# chmod +x /mnt/file.sh 赋予执行权限 [root@localhost mnt]# /mnt/file.sh &  运行脚本打入后台 [1] 4867 [root@localhost mnt]# ps f  脚本为子进程   PID TTY      STAT   TIME COMMAND  2200 pts/1    Ss     0:00 -bash  4867 pts/1    S      0:00  \_ -bash  4868 pts/1    S      0:00  |   \_ sleep 1000  4869 pts/1    R+     0:00  \_ ps f  2145 pts/0    Ss+    0:00 /bin/bash   593 tty1     Ss+    0:02 /usr/bin/Xorg :0 -background none -verbose -auth   1312 ttyS0    Ss+    0:00 /sbin/agetty --keep-baud ttyS0 115200 38400 9600 [root@localhost mnt]# fg    调回打入后台进程 /mnt/file.sh  结束进程

[root@localhost mnt]# vim /mnt/file.sh  编辑脚本只显示a的值

[root@localhost mnt]# echo $a  父级进程可以显示a的值 1 [root@localhost mnt]# /mnt/file.sh  子进程不可以显示a的值,因为进程号不同  [root@localhost mnt]# export a=1   临时修改环境级变量,父级进程做一个声明,子进程a也有值 [root@localhost mnt]# /mnt/file.sh  可以调用脚本 1 [root@localhost mnt]# ps  查看当前进程   PID TTY          TIME CMD  2200 pts/1    00:00:00 bash  4900 pts/1    00:00:00 ps

[root@localhost mnt]# exit  退出 logout Connection to 172.25.254.121 closed. [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X root@172.25.254.121's password:  Warning: untrusted X11 forwarding setup failed: xauth key data not generated Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jun 17 03:44:50 2018 from 172.25.254.21 /usr/bin/xauth:  file /root/.Xauthority does not exist [root@localhost ~]# /mnt/file.sh   临时修改退出失效运行脚本没有值 

[root@localhost ~]# vim .bash_profile 修改用户环境变量

[root@localhost ~]# source .bash_profile  刷新 [root@localhost ~]# echo $a a有值 1 [root@localhost ~]# logout再次退出  Connection to 172.25.254.121 closed. [kiosk@foundation21 Desktop]$  [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X root@172.25.254.121's password:  Warning: untrusted X11 forwarding setup failed: xauth key data not generated Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jun 17 04:49:40 2018 from 172.25.254.21 [root@localhost ~]# echo $a   进入a的值依旧存在 1 [root@localhost ~]# su - student  Last login: Thu May 11 20:23:54 EDT 2017 on pts/0 [student@localhost ~]$ echo $a  进去学生用户没有因为加载的时候已经将原来的文件覆盖,所以root用户设置的不会生效 [student@localhost ~]$ exit  再次退出 logout [root@localhost ~]# echo $a  root用户生效 1 [root@localhost ~]# bash  重新打开一个shell [root@localhost ~]# echo $a  依旧生效 1 [root@localhost ~]# exit exit

[root@localhost ~]# vim /etc/profile  编辑系统变量文件

[root@localhost ~]# cat /etc/profile | tail -n 1  将系统变量文件更改为a=2 export a=2 [root@localhost ~]# source /etc/profile  刷新 [root@localhost ~]# echo $a  a的值已经改变但是是由于刷新临时的 2 [root@localhost ~]# exit 退出 logout Connection to 172.25.254.121 closed. [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X root@172.25.254.121's password:  Warning: untrusted X11 forwarding setup failed: xauth key data not generated Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jun 17 04:52:14 2018 from 172.25.254.21 [root@localhost ~]# echo $a  系统开启先加载系统进程之后加载用户进程,默认读用户进程,所以依旧是a=1 1

[root@localhost ~]# echo $PS1  shell的变量 [\u@\h \W]\$ [root@localhost ~]# PS1='westos>'  更改shell变量 westos>date Sun Jun 17 05:11:52 EDT 2018 westos>PS1='westos\u>' westosroot>PS1='westos \u>' westos root>PS1='westos \W>' westos ~>PS1='westos \W>' westos ~>PS1='westos \w>'   w为绝对路径 westos ~>cd /mnt/ westos /mnt>cd /etc/sysconfig/ westos /etc/sysconfig>PS1='westos \W>' westos sysconfig>cd /etc/sysconfig/  W为相对路径 westos sysconfig>PS1='westos @\W>' westos @sysconfig>exit logout Connection to 172.25.254.121 closed. [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X root@172.25.254.121's password:  Warning: untrusted X11 forwarding setup failed: xauth key data not generated Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jun 17 04:55:02 2018 from 172.25.254.21

[root@localhost ~]# cd /mnt/  [root@localhost mnt]# ls   file.sh  passwd  showline.sh  showusernumber.sh [root@localhost mnt]# showline.sh    直接用相对路径无法调用 bash: showline.sh: command not found... [root@localhost mnt]# echo $PATH   查看环境变量 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost mnt]# chmod +X /mnt/*  给/mnt/下所有文件赋予执行权限 [root@localhost mnt]# chmod +x /mnt/* [root@localhost mnt]# ll  查看权限 total 16 -rwxr-xr-x 1 root root 271 Jun 17 04:49 file.sh -rwxr-xr-x 1 root root 422 Jun 17 03:54 passwd -rwxr-xr-x 1 root root 313 Jun 17 04:12 showline.sh -rwxr-xr-x 1 root root 335 Jun 17 03:38 showusernumber.sh [root@localhost mnt]# PATH=$PATH:/mnt 添加/mnt/为环境变量 [root@localhost mnt]# showline.sh 直接用相对路径可以调用 10

[root@localhost mnt]# echo $PATH 查看环境变量 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt [root@localhost mnt]# exit logout Connection to 172.25.254.121 closed. [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X root@172.25.254.121's password:  Warning: untrusted X11 forwarding setup failed: xauth key data not generated Warning: No xauth data; using fake authentication data for X11 forwarding. Last login: Sun Jun 17 05:20:38 2018 from 172.25.254.21 [root@localhost ~]# showline.sh 退出失效 bash: showline.sh: command not found... [root@localhost ~]# vim /etc/profile  写入系统变量文件

[root@localhost ~]# source /etc/profile  刷新 [root@localhost ~]# echo $PATH  查看环境变量 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt [root@localhost ~]# cd /mnt/ [root@localhost mnt]# showline.sh 可以使用相对路径调用 10

变量名称中通常包含大小写字母,数字,下划线(不是必须) 例如: WESTOS_LINUX Westos_Linux westoS_Linux
""是批量的,\是单个的转义。 单引号等于\的批量。 除了!\`四个符号双引号不可以引用,其他的均可以。 单引号所有均可以引用。 一般情况下,$var${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围,${}作变量声明。 $()等同于`,$()标准的扩展接口,`是扩展性接口,在bash中,$( )与` `(反引号)都是用来作命令替换的。 命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行, 然后将其结果替换出来,再重组成新的命令行。最后,$( )的弊端是, 并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。 $[]等同与(()),将shell中的可变长字符转换成int整形,可变长字符节省空间。 $(( ))可以将其他进制转成十进制数显示出来。 ""弱引用,批量转译""中出现的字符。 ''弱引用,批量转译''中出现的字符。 ``:命令替换,在输出一句话的时候,如果想中间加入命令输出结果, 在反引号里面输入命令就可以做到,和$COMMAND是一样的。
[root@localhost ~]# a=hello world   有空格无法表示需要转译 bash: world: command not found... [root@localhost ~]# a=hello\ world  \转译一个空格 [root@localhost ~]# echo $a hello world [root@localhost ~]# a=hello\  world  \只可以转译一个空格 bash: world: command not found... [root@localhost ~]# a="hello   world"  用引号批量转译 [root@localhost ~]# echo $a hello world [root@localhost ~]# a=1 [root@localhost ~]# echo $ab  无法区分得有空格或者变量声明  [root@localhost ~]# echo $a  b  用空格区分 1 b [root@localhost ~]# echo ${a}b  ${}变量声明 1b [root@localhost ~]# echo 1+1 1+1 [root@localhost ~]# echo $[1+1]  用$[]将1+1转换成整形2 2

[root@localhost ~]# a=(1 2 3)  数组 [root@localhost ~]# echo $a 1 [root@localhost ~]# echo ${a[0]} 调用下标显示数组第零个数,从零开始索引 1 [root@localhost ~]# echo ${a[1]} 调用下标显示数组第一个数 2 [root@localhost ~]# echo ${a[2]} 调用下标显示数组第二个数 3 [root@localhost ~]# ls anaconda-ks.cfg  Documents  Music     Public     Videos Desktop          Downloads  Pictures  Templates [root@localhost ~]# name=(`ls`)     [root@localhost ~]# echo $name   anaconda-ks.cfg [root@localhost ~]# echo ${name[1]}  依次调用name下标显示文件 Desktop [root@localhost ~]# echo ${name[2]} Documents

$1    脚本后的第一串字符串 $2    脚本后的第二串字符串 $3    脚本后的第三串字符串 $#    脚本后所跟字符串的个数 $*    脚本后跟的所有字符串,模式为"1 2 3"一串字符 $@    脚本后跟的所有字符串,模式为"1""2""3"三串字符
[root@localhost mnt]# ps   PID TTY          TIME CMD  2558 pts/1    00:00:00 bash  2604 pts/1    00:00:00 ps [root@localhost mnt]# echo $$   查看当前PID 2558 [root@localhost mnt]# vim &  不占用后台 [1] 2605 [root@localhost mnt]# echo $$   查看当前PID 2558  [1]+  Stopped                 vim

[root@localhost mnt]# vim test.sh  编辑脚本

[root@localhost mnt]# sh test.sh 依次测试,$0后面接脚本名字 $0 is test.sh $1 is $2 is $3 is $# is 0 $* is $@ is  [root@localhost mnt]# sh test.sh westos  $1后面所接第一串字符 $0 is test.sh $1 is westos $2 is $3 is $# is 1 $* is westos $@ is westos [root@localhost mnt]# sh test.sh westos linux  $2后面接第二串字符 $0 is test.sh $1 is westos $2 is linux $3 is $# is 2 $* is westos linux $@ is westos linux [root@localhost mnt]# sh test.sh westos linux redhat  $3后面接第三串字符 $0 is test.sh $1 is westos $2 is linux $3 is redhat $# is 3 $* is westos linux redhat $@ is westos linux redhat

[root@localhost mnt]# ls passfile  test.sh  user_create.sh  userfile [root@localhost mnt]# vim for.sh  编辑脚本检测$*$@区别

[root@localhost mnt]# sh for.sh   [root@localhost mnt]# sh -x for.sh westos linux redhat  $*脚本后跟的所有字符串,模式为"1 2 3"一串字符 + for name in '"$*"' + echo westos linux redhat westos linux redhat

[root@localhost mnt]# vim for.sh  更改为$@

[root@localhost mnt]# sh -x for.sh westos linux redhat $@    脚本后跟的所有字符串,模式为"1""2""3"三串字符 + for name in '"$@"' + echo westos westos + for name in '"$@"' + echo linux linux + for name in '"$@"' + echo redhat redhat

[root@localhost mnt]# vim user_create.sh 编写脚本

[root@localhost mnt]# sh user_create.sh  调用 ERROR:please give me userfile or passfile!! [root@localhost mnt]# sh user_create.sh userfile  文件少于两个 ERROR:please give me userfile or passfile!! [root@localhost mnt]# sh user_create.sh userfile passfile 正确建立文件并显示密码

read    WESTOS read -s  WESTOS   -s表示加密 read -p "input:"  WESTOS   -p表示提示  
[root@localhost mnt]# vim bb.sh [root@localhost mnt]# sh bb.sh 非交互式没有提示 123 123

[root@localhost mnt]# vim bb.sh   加入提示 [root@localhost mnt]# sh bb.sh  please give me a filewestos westos

[root@localhost mnt]# vim cc.sh   交互式提示并检测IP是否在运行 [root@localhost mnt]# sh cc.sh  please input a number: 172.25.254.121 172.25.254.121 is up

[root@localhost mnt]# vim cc.sh   输入时候加入加密 [root@localhost mnt]# sh cc.sh  please input a number: 172.25.254.121 is up

[root@localhost mnt]# vim cc.sh  加入空行不然显示看起来不好看 [root@localhost mnt]# sh cc.sh  please input a number:     172.25.254.121 is up

[root@localhost mnt]# vim user_create.sh  编写脚本

[root@localhost mnt]# sh user_create.sh  调用脚本 please input userfile: lee  文件错误 ERROR: lee is not exist!! [root@localhost mnt]# sh user_create.sh  please input userfile: userfile please input passfile: lee  文件名不匹配无法运行脚本 ERROR: lee is not exist!! [root@localhost mnt]# sh user_create.sh   调用脚本 please input userfile: userfile  有提示输入文件 please input passfile: passfile Changing password for user user1. passwd: all authentication tokens updated successfully.  建立成功 Changing password for user user2. passwd: all authentication tokens updated successfully. Changing password for user user3. passwd: all authentication tokens updated successfully.

[root@localhost mnt]# su - user1  成功切换建立用户 [user1@localhost ~]$ su - user2  验证密码 Password:  Last failed login: Sun Jun 17 01:01:47 EDT 2018 on pts/1 There was 1 failed login attempt since the last successful login. [user2@localhost ~]$ exit  退出 logout [user1@localhost ~]$ exit logout

[root@localhost mnt]# alias  查看系统中的别名 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@localhost mnt]# alias xfl='vim'  设置别名

[root@localhost mnt]# xfl调用直接打开vim按:q退出

[root@localhost mnt]# alias  查看别名已经加入 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' alias xfl='vim' [root@localhost mnt]# exit  退出失效 [kiosk@foundation21 Desktop]$ ssh root@172.25.254.121 -X [root@localhost ~]# alias  查看别名失效 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

[root@localhost ~]# vim .bashrc  编辑用户家目录文件

[root@localhost ~]# source .bashrc 刷新 [root@localhost ~]# alias  查看别名永久生效 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' alias xfl='vim' [root@localhost ~]# su -student  切换到学生用户 su: failed to execute tudent: No such file or directory [root@localhost ~]# su - student Last login: Sun Jun 17 04:52:35 EDT 2018 on pts/1 [student@localhost ~]$ xfl  不生效 bash: xfl: command not found... [student@localhost ~]$ exit logout

[root@localhost ~]# vim /etc/bashrc   编辑系统配置文件

[root@localhost ~]# source /etc/bashrc  刷新 [root@localhost ~]# su - student  切换用户 Last login: Sun Jun 17 22:44:46 EDT 2018 on pts/0 [student@localhost ~]$ alias  永久有效 alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' alias xfl='vim' [student@localhost ~]$ xfl  调用 [student@localhost ~]$ exit logout [root@localhost ~]# vim /etc/bashrc  删除添加 [root@localhost ~]# vim .bashrc   删除添加 [root@localhost ~]# source .bashrc  刷新 [root@localhost ~]# source /etc/bashrc  刷新

[root@localhost ~]# alias  查看还在 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' alias xfl='vim' [root@localhost ~]# unalias xfl  unalias 撤销命令的别名 [root@localhost ~]# alias 查看已经撤销 alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行。 退出码(exit status,或exit code)的约定: 0表示成功(Zero - Success) 非0表示失败(Non-Zero  - Failure) 2表示用法不当(Incorrect Usage) 127表示命令没有找到(Command Not Found) 126表示不是可执行的(Not an executable) >=128 信号产生
[root@localhost ~]# echo $? 0 [root@localhost ~]# ls anaconda-ks.cfg  Documents  Music     Public     Videos Desktop          Downloads  Pictures  Templates [root@localhost ~]# echo $?  查看退出值 0 [root@localhost ~]# vim file.sh 编写脚本

[root@localhost ~]# sh file.sh 调用 hello world [root@localhost ~]# echo $?  查看退出值 1

[root@localhost ~]# vim file.sh  编写脚本退出值自己设定

[root@localhost ~]# sh file.sh 调用 hello world [root@localhost ~]# echo $?  查看退出值 66

Hostname=$(hostname) Hostname=`hostname` $? $?是命令在执行完成之后产生的退出值,范围是[0-255] 当$0=0时标示命令执行时没有错误输出,这个值可以用exit命令执行。
[root@localhost mnt]# vim cc.sh   编写脚本检测$?退出值是否等于0来返回值

[root@localhost mnt]# sh cc.sh  please input a number:     172.25.254.111 is up

函数可以确保命令循环执行,可以解决命令多重复的情况, 函数用来简化脚本,使脚本可以循环执行。
[root@localhost mnt]# vim ip_check.sh   编写脚本

[root@localhost mnt]# sh ip_check.sh   检测脚本功能 please input a ipaddr: 172.25.254.111 172.25.254.111 is up please input a ipaddr: 172.25.254.222 172.25.254.222 is down please input a ipaddr: exit byebye

[root@localhost mnt]# vim file_check.sh   编写脚本

[root@localhost mnt]# sh file_check.sh /dev/vdb   检测文件类型 /dev/vdb is link [root@localhost mnt]# sh file_check.sh /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock is not exist!! [root@localhost mnt]# sh file_check.sh /dev/pts/1 /dev/pts/1 is link

[root@localhost mnt]# vim user_ctl.sh  编写脚本

[root@localhost mnt]# sh user_ctl.sh   调用脚本演示功能 [root@localhost mnt]# sh user_ctl.sh  please input action: add please input a username: lee   建立用户 please input a password:  Changing password for user lee. passwd: all authentication tokens updated successfully. please input action: del   删除用户 please input a username:lee please input action: exit bye

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!