Linux学习笔记--Shell基本操作

  • 基本输出全局变量

[stephen@CentOS04 ~]$ su -    # 切换为root用户
Password: 
[root@CentOS04 ~]# mkdir scripts
[root@CentOS04 ~]# cd scripts/
[root@CentOS04 scripts]# ls
[root@CentOS04 scripts]# echo $HOME    # 显示当前用户主目录
/root
[root@CentOS04 scripts]# echo $USER    # 显示当前用户账号
root
[root@CentOS04 ~]# echo $UID    # 显示root用户UID
0
[root@CentOS04 test]# echo $SHELL     # 显示当前使用的SHELL版本
/bin/bash
[root@CentOS04 test]# grep root /etc/passwd    # 查看OS使用的是哪种SHELL
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@CentOS04 scripts]# logout    # 切换回用户stephen
[stephen@CentOS04 ~]$ echo $HOME
/home/stephen
[stephen@CentOS04 ~]$ echo $USER
stephen
[stephen@CentOS04 ~]$ echo $UID
501
[stephen@CentOS04 ~]$ echo $SHELL
/bin/bash
[stephen@CentOS04 ~]$ echo $PS1    # 当前用户命令前缀格式:user/host/当前路径
[\u@\h \W]\$
[stephen@CentOS04 ~]$ echo $HOSTTYPE    # 当前服务器CPU架构
x86_64


  • 写文件

[root@CentOS04 sysconfig]# cd /root/test/
[root@CentOS04 test]# ls
[root@CentOS04 test]# echo stephen > test.log    # echo写内容
[root@CentOS04 test]# cat test.log 
stephen
[root@CentOS04 test]# >test.log     # 写入空内容
[root@CentOS04 test]# cat test.log     # 无结果显示
[root@CentOS04 test]# echo >test.log     # echo写入空内容
[root@CentOS04 test]# cat test.log     # 结果显示空内容

[root@CentOS04 test]# cat /dev/null >test.log # 另外一种方式写入空内容
[root@CentOS04 test]# cat test.log


  • 定义环境变量

[root@CentOS04 test]# tac /etc/init.d/nfs    # 与cat相反,倒序输出
...
#               the NFS services.
# nfs           This shell script takes care of starting and stopping
#
#!/bin/sh    # 可直接在最尾看到文件第一行内容
[root@CentOS04 test]# head -1 /etc/init.d/nfs    # 使用head -1查看文件第一行内容
#!/bin/sh


  • “#”的使用

[root@CentOS04 test]# vi test.sh
"test.sh" [New] 5L, 92C written
[root@CentOS04 test]# cat test.sh 
#!/bin/bash    # 声明环境变量
echo "stephen start"
#!/bin/bash <== comment here!    # 此处注释
#!/bin/sh                        # 此处注释
echo "stephen end"
[root@CentOS04 test]# sh test.sh 
stephen start
stephen end


  • 查看官方SHELL书写规范

[stephen@CentOS04 ~]$ cat /etc/bashrc     # bashrc文件提供标准SHELL书写规范
# /etc/bashrc

# System wide functions and aliases
# Environment stuff goes in /etc/profile

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
...
[stephen@CentOS04 ~]$ cat /etc/profile    # profile文件提供许多方法供阅读
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
...
[stephen@CentOS04 ~]$ cd /etc/profile.d/    # vim的SHELL文件位置
[stephen@CentOS04 profile.d]$ ll
total 52
-rw-r--r--. 1 root root 1127 Mar  5 20:17 colorls.csh
-rw-r--r--. 1 root root 1143 Mar  5 20:17 colorls.sh
-rw-r--r--. 1 root root   92 Nov 22  2013 cvs.csh
-rw-r--r--. 1 root root   78 Nov 22  2013 cvs.sh
-rw-r--r--. 1 root root  192 Feb 24 22:24 glib2.csh
-rw-r--r--. 1 root root  192 Feb 24 22:24 glib2.sh
-rw-r--r--. 1 root root 1741 Feb 20 18:44 lang.csh
-rw-r--r--. 1 root root 2706 Feb 20 18:44 lang.sh
-rw-r--r--. 1 root root  122 Feb  7  2007 less.csh
-rw-r--r--. 1 root root  108 Feb  7  2007 less.sh
-rw-r--r--. 1 root root   97 Apr  5  2012 vim.csh
-rw-r--r--. 1 root root  269 Apr  5  2012 vim.sh
-rw-r--r--. 1 root root  169 May 20  2009 which2.sh


  • 编辑profile文件

[stephen@CentOS04 ~]$ echo $TMOUT

[stephen@CentOS04 ~]$ echo $HISTFILESIZE
1000
[stephen@CentOS04 ~]$ vi /etc/profile
# /etc/profile
...
HISTFILESIZE=5
HISTSIZE=5    # 历史记录大小?行数?
TMOUT=5    # 5s后自动logout
"/etc/profile" 81L, 1830C written
[stephen@CentOS04 ~]$ . /etc/profile    # 修改配置后需载入才能生效
[stephen@CentOS04 ~]$ timed out waiting for input: auto-logout # 自动登出
...
[stephen@CentOS04 ~]$ echo $TMOUT    # 后改为600
600
[stephen@CentOS04 ~]$ history    # 显示历史记录(5行)
    8  vi /etc/profile
    9  sudo vi /etc/profile
   10  . /etc/profile
   11  echo $TMOUT
   12  history


  • 手工加入全局变量

[stephen@CentOS04 ~]$ sudo vi /etc/profile
# /etc/profile
...
TMOUT=600

export stephen="I am stephen"    # 定义全局变量stephen
"/etc/profile" 83L, 1863C written
[stephen@CentOS04 ~]$ tail -1 /etc/profile
export stephen="I am stephen"
[stephen@CentOS04 ~]$ echo $stephen    # 未加载,没有显示

[stephen@CentOS04 ~]$ su -
Password: 
[root@CentOS04 ~]# cd scripts/
[root@CentOS04 scripts]# . /etc/profile    # 加载profile文件
[root@CentOS04 scripts]# echo $stephen    # 显示全局变量
I am stephen
[root@CentOS04 scripts]# ls
[root@CentOS04 scripts]# vi m2.sh
"m2.sh" [New] 1L, 9C written
[root@CentOS04 scripts]# cat m2.sh     # 自定义SHELL文件用于显示全局变量
echo $stephen
[root@CentOS04 scripts]# sh m2.sh 
I am stephen


  • 查询系统环境变量:printenv

[root@CentOS04 scripts]# printenv
HOSTNAME=CentOS04.stephenzhou.net
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
OLDPWD=/root
stephen=I am stephen
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root/scripts
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/bin/printenv


  • 无引号、单引号及双引号的用法

[root@CentOS04 scripts]# a=192.168.1.2
[root@CentOS04 scripts]# b='192.168.1.3'
[root@CentOS04 scripts]# c="192.168.1.4"
[root@CentOS04 scripts]# echo "a=$a"
a=192.168.1.2
[root@CentOS04 scripts]# echo "b=$b"
b=192.168.1.3
[root@CentOS04 scripts]# echo "c=$c"
c=192.168.1.4
[root@CentOS04 scripts]# echo "c=${c}"
c=192.168.1.4
[root@CentOS04 scripts]# a=192.168.1.2-$a    # 无引号可引入变量
[root@CentOS04 scripts]# b='192.168.1.2-$a'    # 单引号全引用
[root@CentOS04 scripts]# c="192.168.1.2-$a"    # 双引号可引入变量
[root@CentOS04 scripts]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@CentOS04 scripts]# echo "b=$b"
b=192.168.1.2-$a
[root@CentOS04 scripts]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2
[root@CentOS04 scripts]# echo '`date`'
`date`
[root@CentOS04 scripts]# echo "`date`"
Wed Jun 25 19:27:59 CST 2014
[root@CentOS04 scripts]# echo `date`
Wed Jun 25 19:28:32 CST 2014
[root@CentOS04 scripts]# ETT=123
[root@CentOS04 scripts]# awk 'BEGIN {print '$ETT'}'    # awk中用法相反
123
[root@CentOS04 scripts]# awk 'BEGIN {print "$ETT"}'
$ETT


  • 通过读取HOSTS文件,输入IP显示主机名

    • 方法一:通过grep过滤

[root@CentOS04 scripts]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.2     dc01 dc01.stephenzhou.net
192.168.2.31    ex2013a ex2013a.stephenzhou.net
"/etc/hosts" 4L, 241C written
[root@CentOS04 scripts]# vi judgehost.sh   
#!/bin/bash
echo "please input ip address:"
read ip
[ -n "`grep "$ip " /etc/hosts`" ] && \
echo "The hostname is: `grep "$ip " /etc/hosts |awk '{print $2}'`" || \
echo "The ip is invalid"
"judgehost.sh" 6L, 188C written
[root@CentOS04 scripts]# bash judgehost.sh 
please input ip address:
192.168.2.2
The hostname is: dc01
[root@CentOS04 scripts]# bash judgehost.sh 
please input ip address:
192.168.2.31
The hostname is: ex2013a
[root@CentOS04 scripts]# bash judgehost.sh 
please input ip address:
localhost
The hostname is: localhost
localhost
[root@CentOS04 scripts]# mv judgehost.sh judgehost_grep.sh
[root@CentOS04 scripts]# ls
judgehost_grep.sh  m2.sh

    • 方法二:通过awk过滤

[root@CentOS04 scripts]# mv judgehost.sh judgehost_grep.sh
[root@CentOS04 scripts]# ls
judgehost_grep.sh  m2.sh
[root@CentOS04 scripts]# vi judgehost_flag.sh            
#!/bin/bash
#judge input
if [ $# -ne 1 ]
	then
		echo "input error!"
		exit 1
fi

flag=0
exec < /etc/hosts
while read line
do
	if { "$1" = "`echo $line|awk '{print $1}'`" }
		then
			flag=1
			echo "the $1 's hostname is `echo $line|awk '{print $2}'`"
			break;
	fi
done
[ $flag -eq 0 ] && echo "sorry, not fine $1 's hostname!"
"judgehost_flag.sh" 20L, 329C written
[root@CentOS04 scripts]# vi awkhost1.sh
awk 'BEGIN {a="'$1'"} {if($1==a) print $2; }' /etc/hosts
"awkhost1.sh" [New] 1L, 57C written
[root@CentOS04 scripts]# sh awkhost1.sh 192.168.2.2
dc01
[root@CentOS04 scripts]# vi awkhost2.sh
awk '{if($1=="'$1'") print $2}' /etc/hosts
"awkhost2.sh" [New] 1L, 43C written
[root@CentOS04 scripts]# sh awkhost2.sh 192.168.2.2
dc01


  • 操作系统定义函数/etc/init.d/functions

[stephen@CentOS04 ~]$ more /etc/init.d/functions     # 大量系统自带函数(checkpid()/killproc()/echo_success()/)定义
# -*-Shell-script-*-
#
# functions     This file contains functions to be used by most or all
#               shell scripts in the /etc/init.d directory.
#
...


  • 定义系统变量

[root@CentOS04 ~]# ls
abccs.dbb  anaconda-ks.cfg  iis  install.log  install.log.syslog  mytable.txt  scripts  test  title.txt
[root@CentOS04 ~]# echo $cmd

[root@CentOS04 ~]# cmd=`ls`    # 定义cmd为系统变量ls
[root@CentOS04 ~]# echo $cmd
abccs.dbb anaconda-ks.cfg iis install.log install.log.syslog mytable.txt scripts test title.txt
[root@CentOS04 ~]# cmd=`date +%F`    # 定义cmd为当前时间
[root@CentOS04 ~]# echo $cmd
2014-06-25
[root@CentOS04 ~]# cmd=$(date +%F)    # 可用``,亦可用()
[root@CentOS04 ~]# echo $cmd
2014-06-25
[root@CentOS04 ~]# tar zcf etc_${cmd}_stephen.tar.gz /etc    # 利用系统变量(时间)对文件名进行修改
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
[root@CentOS04 ~]# ll etc_*
-rw-r--r--. 1 root root 8715620 Jun 25 20:37 etc_2014-06-25_stephen.tar.gz
[root@CentOS04 ~]# uname -n
CentOS04.stephenzhou.net
[root@CentOS04 ~]# tar zcf etc_`uname -n`.tar.gz /etc/    # 利用系统变量(主机名)对文件名进行修改
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
[root@CentOS04 ~]# ll etc_*
-rw-r--r--. 1 root root 8715620 Jun 25 20:37 etc_2014-06-25_stephen.tar.gz
-rw-r--r--. 1 root root 8715620 Jun 25 20:47 etc_CentOS04.stephenzhou.net.tar.gz
[root@CentOS04 ~]# hostname=$(uname -n)    # 系统变量(主机名)赋予主机名
[root@CentOS04 ~]# echo $hostname
CentOS04.stephenzhou.net


  • 位置变量

    • $0

[root@CentOS04 scripts]# cat 0.sh 
echo $0
[root@CentOS04 scripts]# sh 0.sh     # $0用于获取当前执行的SHELL脚本的文件名
0.sh
[root@CentOS04 scripts]# sh /root/scripts/0.sh
/root/scripts/0.sh
[root@CentOS04 scripts]# cat 0.sh 
dirname $0    # 路径名
basename $0    # 文件名
[root@CentOS04 scripts]# sh /root/scripts/0.sh 
/root/scripts
0.sh
[root@CentOS04 scripts]# sh 0.sh $0
.
0.sh
[root@CentOS04 scripts]# sh /root/scripts/0.sh 
/root/scripts
0.sh
    • $1/$2/$3...

[root@CentOS04 scripts]# seq -s " $" 0 10
0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
[root@CentOS04 scripts]# seq 9|sed 's#[0-9]#$&#g'
$1
$2
$3
$4
$5
$6
$7
$8
$9
[root@CentOS04 scripts]# cat n.sh 
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
[root@CentOS04 scripts]# sh n.sh kk ff    # $1对应第一位kk,$2对应第二位ff
kk ff kk0    # kk0则为{$1}0->kk0
[root@CentOS04 scripts]# vi n.sh      
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
"n.sh" 1L, 38C written
[root@CentOS04 scripts]# sh n.sh kk ff
kk ff
[root@CentOS04 scripts]# sh n.sh `seq -s " " 10`    # 自动生成数字1~10
1 2 3 4 5 6 7 8 9 10
    • $#

[root@CentOS04 scripts]# vi n.sh 
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
echo $#
"n.sh" 2L, 46C written
[root@CentOS04 scripts]# sh n.sh `seq -s " " 10`
1 2 3 4 5 6 7 8 9 10
10    # $#为显示参数总个数
    • $?

[root@CentOS04 scripts]# stephen
-bash: stephen: command not found
[root@CentOS04 scripts]# echo $?    # 获取上个指令的返回值
127
[root@CentOS04 scripts]# pwd
/root/scripts
[root@CentOS04 scripts]# echo $?
0
    • 位置变量总结

[root@CentOS04 scripts]# vi all.sh
"all.sh" [New] 10L, 325C written
[root@CentOS04 scripts]# cat all.sh 
echo '$0 Get file name:' $0
echo '$n Get nth args, n=1...9:' '$1'=$1 '$2'=$2 "\$3=$3"
echo '$* Get all args...' $*
echo '$# return count:' $#
echo '$$ Return PID:' $$
sleep 2 &
echo '$! exec last command's PID:' $!
echo '$? return last command's return value:' $?
echo '$@ all args:' $@
echo '$_ last command's last arg:' $_
[root@CentOS04 scripts]# sh all.sh  stephen stan zac
$0 Get file name: all.sh
$n Get nth args, n=1...9: $1=stephen $2=stan $3=zac
$* Get all args... stephen stan zac
$# return count: 3
$$ Return PID: 5624
$! exec last commands PID: $!
echo 0 return last commands return value: 0
$@ all args: stephen stan zac
all.sh: line 10: unexpected EOF while looking for matching `''
all.sh: line 11: syntax error: unexpected end of file
    • $*及$@

[root@CentOS04 scripts]# set -- "I am" handsome stephen.
[root@CentOS04 scripts]# for i in $*;do echo $i;done
I
am
handsome
stephen.
[root@CentOS04 scripts]# for i in $@;do echo $i;done
I
am
handsome
stephen.
[root@CentOS04 scripts]# for i;do echo $i;done    # 不加范围等同"$@"
I am
handsome
stephen.
[root@CentOS04 scripts]# for i in "$@";do echo $i;done    # "$@"这个程序的所有参数
I am
handsome
stephen.
[root@CentOS04 scripts]# for i in "$*";do echo $i;done     # "$*"获取当前所有参数
I am handsome stephen.
    • 位置及分片

[root@CentOS04 ~]# OLDBOY="I am stephen"
[root@CentOS04 ~]# echo $OLDBOY
I am stephen
[root@CentOS04 ~]# echo ${#OLDBOY}    # 获得字节个数
12
[root@CentOS04 ~]# echo $OLDBOY|wc -m
13
[root@CentOS04 ~]# echo ${OLDBOY:2}     # 截取前两个字节
am stephen
[root@CentOS04 ~]# echo ${OLDBOY:2:2}    # 截取前两个字节并再输出两个字节
am
[root@CentOS04 ~]# echo ${OLDBOY}|cut -c 3-4     # 只输出第三到第四个字节
am


  • SHELL脚本批量修改文件名

[root@CentOS04 test]# for f in `cat a.log`;do touch $f;done
[root@CentOS04 test]# ll
total 4
-rw-r--r--. 1 root root 104 Jun 25 23:25 a.log
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_1_finished.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_2_finished.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_3_finished.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_4_finished.jpg
[root@CentOS04 test]# test="stu_102999_4_finished.jpg"
[root@CentOS04 test]# echo $test
stu_102999_4_finished.jpg
[root@CentOS04 test]# echo ${test}
stu_102999_4_finished.jpg
[root@CentOS04 test]# echo ${test%finished} 
stu_102999_4_finished.jpg
[root@CentOS04 test]# echo ${test%finished*}
stu_102999_4_
[root@CentOS04 test]# echo ${test%finished*}.jpg
stu_102999_4_.jpg
[root@CentOS04 test]# vi piliangxiugai.sh
"piliangxiugai.sh" [New] 4L, 57C written
[root@CentOS04 test]# vi piliangxiugai.sh
for  f in `ls *.jpg`
do
        mv $f `echo ${f%finished*}.jpg`
done
"piliangxiugai.sh" 5L, 88C written
[root@CentOS04 test]# sh piliangxiugai.sh 
stu_102999_1_.jpg
stu_102999_2_.jpg
stu_102999_3_.jpg
stu_102999_4_.jpg
  • 使用rename改文件名

[root@CentOS04 test]# ll
total 8
-rw-r--r--. 1 root root 104 Jun 25 23:25 a.log
-rw-r--r--. 1 root root  85 Jun 26 00:09 piliangxiugai.sh
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_1.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_2.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_3.jpg
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_4.jpg
[root@CentOS04 test]# rename .jpg .htm *.jpg
[root@CentOS04 test]# ll
total 8
-rw-r--r--. 1 root root 104 Jun 25 23:25 a.log
-rw-r--r--. 1 root root  85 Jun 26 00:09 piliangxiugai.sh
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_1.htm
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_2.htm
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_3.htm
-rw-r--r--. 1 root root   0 Jun 25 23:25 stu_102999_4.htm


  • 变量替换

[root@web01 test]# result=${test:-UNSET}    # ${value:-word},当变量未定义或者值为空时,返回值为word内容,否则返回变量的值。
[root@web01 test]# echo $result    # result赋予UNSET,即使test未定义
UNSET
[root@web01 test]# echo $test    # 由于test未定义,所以值依然为空

[root@web01 test]# unset $test
[root@web01 test]# tail -1 /etc/profile
export stephen="I am stephen"
[root@web01 test]# result=${stephen:-UNSET}
[root@web01 test]# echo $result    # 由于stephen为全局变量,故result有值
I am stephen
[root@web01 test]# echo $stephen    # stephen为全局变量
I am stephen
[root@web01 test]# unset result
[root@web01 test]# echo $result

[root@web01 test]# unset test
[root@web01 test]# echo $test

[root@web01 test]# result=${test:=UNSET}    # ${value:=word},当变量不存在时,会给变量赋于后面的内容
[root@web01 test]# echo $result
UNSET
[root@web01 test]# echo $test    # test未定义,但会给其赋予后面的内容
UNSET
  • 变量替换实际应用

[root@web01 test]# cat d.sh 
path=/server/backup
find ${path:=/tmp} -name "*.tar.gz" -type f|xargs rm -f    # 当变量path值存在时
[root@web01 test]# mkdir /server/backup -p
[root@web01 test]# sh -x d.sh 
+ path=/server/backup
+ find /server/backup -name '*.tar.gz' -type f
+ xargs rm -f
[root@web01 test]# sed -i '1d' d.sh     # 删除d.sh第一行内容
[root@web01 test]# cat d.sh 
find ${path:=/tmp} -name "*.tar.gz" -type f|xargs rm -f    # 当变量path没有值时,赋予其后面的值/tmp
[root@web01 test]# sh -x d.sh 
+ find /tmp -name '*.tar.gz' -type f
+ xargs rm -f








你可能感兴趣的:(linux,shell)