Shell脚本编程基础之shell脚本位置变量

位置变量

在bash shall中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数

听起来就像是交互式时候用的

常见位置变量

  • $n $1,$2,$3……$n之类的,对应第一个、第二个参数 ##进行自动赋值

  • $0 指命令本身,并且包括路径

  • $* 传递给脚本的所有参数,所有参数合并为一个字符串

  • $@ 传递给脚本的所有参数,每个参数表现为一个独立的字符串

  • $# 传递给脚本参数的个数

  • 清空所有位置变量

set -- 

$*和$@

$* 现实的是单个参数合起来

[20:34:04 root@C8-3-55 ~]#vim f1.sh
[20:36:00 root@C8-3-55 ~]#vim f2.sh
[20:37:04 root@C8-3-55 ~]#chmod +x f1.sh f2.sh
[20:37:31 root@C8-3-55 ~]#cat f1.sh f2.sh
#!/bin/bash
echo All args are "$*"
f2.sh "$*"
#!/bin/bash
echo 1st arg is $1
[20:39:50 root@C8-3-55 ~]#cp f1.sh /usr/local/bin;cp f2.sh /usr/local/bin
cp:是否覆盖'/usr/local/bin/f1.sh'? y
[20:40:19 root@C8-3-55 ~]#f1.sh a b c
All args are a b c
1st arg is a b c  ## 嵌套执行f2.sh 显示$1的时候,将f1后面的参数作为一个整体
[20:40:31 root@C8-3-55 ~]#f2.sh a b c
1st arg is a

将$* 改为$@后,则仍旧单个显示参数

[20:55:53 root@C8-3-55 ~]#cat f3.sh
#!/bin/bash
echo 1st arg is "$1"
echo 2st arg is "$2"
echo 3st arg is "$3"
echo All args arg "$*"
echo All args are "$@"
f2.sh "$@"

[20:59:18 root@C8-3-55 ~]#./f3.sh d e f
1st arg is d
2st arg is e
3st arg is f
All args arg d e f
All args are d e f
1st arg is d

$0可以显示脚本名

  • $0显示脚本名,可以利用软链接创建多个不同的名字。

  • 根据不同的名字进行条件判断,让同一脚本实现不同功能

实例

  • 显示位置变量的用法
  1 #!/bin/bash
  2 #
  3 echo 1st arg is $1
  4 echo 2st arg is $2
  5 echo 3st arg is $3
  6
  7 echo args all are $*
  8 echo args all are $@
  9
 10 echo arg number is $#
 11
 12 echo the scripatname is $(`basename` $0)
[01:30:51 root@C8-3-55 ~]#bash -x arg.sh William Henry Gates III
+ echo 1st arg is William
1st arg is William
+ echo 2st arg is Henry
2st arg is Henry
+ echo 3st arg is Gates
3st arg is Gates
+ echo args all are William Henry Gates III
args all are William Henry Gates III
+ echo args all are William Henry Gates III
args all are William Henry Gates III
+ echo arg number is 4
arg number is 4
+ echo the scripatname is basename arg.sh
the scripatname is basename arg.sh
  • 运用位置便令编写备份脚本
[02:08:35 root@C8-3-55 ~]#cat backup_V1.0.sh
#!/bin/bash
#
SRC=$1
DEST=/backup${SRC}_`date +%F_%H-%M-$S`
tar -czvf $DEST.tar.gz $SRC
[02:08:46 root@C8-3-55 ~]#bash backup_V1.0.sh /data
tar: 从成员名中删除开头的“/”
/data/
/data/data1.log

[02:09:53 root@C8-3-55 ~]#ll /backup/
总用量 0
[02:09:59 root@C8-3-55 ~]#bash backup_V1.0.sh /data
tar: 从成员名中删除开头的“/”
/data/
/data/data1.log
[02:10:06 root@C8-3-55 ~]#ll /backup/
总用量 4
-rw-r--r--. 1 root root 224 3月  11 02:10 data_2021-03-11_02-10-.tar.gz
  • 使用位置变量实现mv替代rm命令的脚本

用mv代替rm可以防止误删除


[02:34:39 root@C8-3-55 ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[02:35:55 root@C8-3-55 ~]#ln rm.sh /usr/bin/rmtomv.sh  ##在环境变量目录中做硬链接
[02:40:41 root@C8-3-55 ~]#alias rm='/usr/bin/rmtomv.sh' ##对rm进行别名
[02:41:05 root@C8-3-55 ~]#type rm
rm 是 `/usr/bin/rmtomv.sh' 的别名 ##查看rm现状
[02:43:44 root@C8-3-55 ~]#cat rm.sh
#!/bin/bash
#
WARING_COLOR="echo -e E[1:31m"
END="E[0m"
DIR=/tmp/RECYCLER_`date +%F_%H-%M-%S` ##定义回收站目录
mkdir $DIR
mv $* $DIR
${WARING_COLOR}Already Moved $* to $DIR !!! $END


[02:45:47 root@C8-3-55 ~]#mkdir /data ; touch /data/{a..b}{1..3}.log;ll /data
总用量 0
-rw-r--r--. 1 root root 0 3月  11 02:46 a1.log
-rw-r--r--. 1 root root 0 3月  11 02:46 a2.log
-rw-r--r--. 1 root root 0 3月  11 02:46 a3.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b1.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b2.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b3.log
[02:46:58 root@C8-3-55 ~]#type rm ##再次确认命令状态
rm 是 `/usr/bin/rmtomv.sh' 的别名
[02:47:09 root@C8-3-55 ~]#rm /data/*
Already Moved /data/a1.log /data/a2.log /data/a3.log /data/b1.log /data/b2.log /data/b3.log to /tmp/RECYCLER_2021-03-11_02-47-27 !!!
[02:47:27 root@C8-3-55 ~]#ll /tmp/RECYCLER_2021-03-11_02-47-27 ##查看回收站
总用量 0
-rw-r--r--. 1 root root 0 3月  11 02:46 a1.log
-rw-r--r--. 1 root root 0 3月  11 02:46 a2.log
-rw-r--r--. 1 root root 0 3月  11 02:46 a3.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b1.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b2.log
-rw-r--r--. 1 root root 0 3月  11 02:46 b3.log

ln硬链接命令方便版本更新,更新程序后只要重做硬链接即可,系统中别名命令不变

* * * 胖并快乐着的死肥宅 * * *
原文地址:https://www.cnblogs.com/bpzblog/p/14517019.html