shell脚本基础之变量使用

正则表达式符号
. 任意的一个字符
* 前边字符重复任意次
(cui)* 前边单词重复任意次
X+ 加号前边字符重复1次以上
X{1,}  表1次
X{1,8} 最少一次最多8次
X{,n} 最多几次
X?表0次
X{m} 精确匹配多少次
^ 行首(中括号外)
$ 行尾
\< \b  单词的词首
\> \b  单词的词尾
[wang] w a n g  中括号里面的任意一个字符
[^.] 中括号里面 ^ 表示除了  除了. 的任意字符
a|buy  a或buy
(a|b)uy auy或buy
(epr) (epr2) \1 \2  匹配完的结果 第一个 第二个
 
执行权限
执行脚本: 【hello.sh】
①有执行权限  chmod +x hello.sh
相对路径 ./hello.sh
②没有执行权限也想执行
bash hello.sh
cat hello.sh |bsah
③直接执行 hello.sh 即可
echo $PATH  --把文件放到任何PATH目录下即可
[root@localhost date]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost date]#chmod +x hello.sh
[root@localhost date]# mkdir /root/bin
[root@localhost date]# mv hello.sh /root/bin/
[root@localhost date]# hello.sh
[root@localhost date]# hash
执行后脚本文件会 hash到内存里面,一旦将PATH下的文件换个目录,重新执行hello.sh 将找不到文件;
需要删除hash文件路径:hash -d hello.sh ;即可
 
脚本调试:
检测脚本中的语法错误:bash -n f1.sh  -n 只检测语法
bash -x f1.sh 跟踪执行逻辑问题
 
变量的使用
定义变量若值等于命令如:hostname,使用反引号引用。
例:① name=`hostname`  ②name=`cat/etc/fstab`
echo $name  数据多的话格式会有问题,所有数据都在一行
echo "$name" 保留格式
 
变量:字符串、数字
shell里可以直接赋值,无需指定数据类型。
变量名不能使用数字作为开头。
    
变量:$ 带$则是变量名
引用变量需要加 $
echo $PATH
 
bash中变量的种类:
局部变量:当前session有效
echo $$ 当前进程的进程编号
echo $PPID 当前进程的父进程编号
pstree -p  查进程树 centos最小安装不能直接使用该命令,需安装psmisc
局部变量只在当前bash运行
$SHLVL 查看shell嵌套了几层
 
环境变量:全局变量
name=hello
echo $name
export name 向子进程声明环境变量 or exoport name=hello
export\env 可以查看系统里的环境变量
unset name 删除变量名释放内存
 
env-->export  :查看系统里的环境变量
 
变量的分类
只读变量-->常量声明
readonly name =hello  只能使用不能修改,不可unset  exit 退出程序常量消失
declare  -r  =readonly  -p  系统自带常量
 
() 命令放小括号里,一次性任务,开启子shell,可以定义一次性变量,结束后不影响环境
{}大括号影响当前shell环境
 
位置变量
$1  $2  $3 表示  $*为多个参数
执行脚本后边跟的$1 $2 $3 等
 
scp 远程复制文件 scp f1 wang@192.168.8.12:/root/bin   ps:非root用户,目标路径的所有者为wang用户
复制当前目录下的文件,到对方主机wang用户@对方地址:、对方目录
将对方主机、用户、路径写入脚本scp.sh,需要传输的文件作为变量.
!#/bin/bash
echo "start  copy......"
scp $1  root@192.168.8.12:/root/bin 
echo "copy is finished"
 
执行脚本:scp.sh /etc/aaa   --$1的位置参数     $* 后边可以跟多个文件
位置参数$* 跟 $@ 的区别:使用时需要用""引号引起来。
$*:传递给脚本的所有参数,全部参数合为一个字符串。
$@:传递给脚本的所有参数,每个参数为独立字符串。
$0:命令本身
$#:传递给脚本的参数个数。
 
ln -s scp.sh link.sh  创建scp.sh 的软连接为link.sh  执行link.sh $0 显示为link.sh
使用软连接做到同一个脚本,不同功能。
例如:
[root@localhost ~]# which pidof
/usr/sbin/pidof
[root@localhost ~]# ll /usr/sbin/pidof
lrwxrwxrwx. 1 root root 18 Nov 13 19:06 /usr/sbin/pidof -> /usr/sbin/killall5
[root@localhost ~]# /usr/sbin/pidof bash   --软连接执行bash 返回的结果
2005 621
[root@localhost ~]# /usr/sbin/killall5 bash  --源文件执行bash返回的结果
killall5: only one argument, a signal number, allowed
执行结果不一致也就是$0为不同结果时,可以实现不同效果,不同值可以做不同功能。
 
算数运算
算数的使用方法
let z=x+y   echo $z   ② z =$[x+y]  ③z = $((x+y))  ④expr 3 + 4    *expr是个命令
 
echo $?   值为0是真,值为1是假
&  并且   | 或者
&& 短路 与    【逻辑关系:如果 cmd1 && cmd2 ,cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行】
|| 短路 或     【逻辑关系:如果cmd1 || cmd2 ,cmd1为真cmd2不需要执行,反之cmd1 为假,需要cmd2执行】
 
小练习:编写脚本 /root/bin/sumid.sh  计算/etc/passwd 文件中第十个用户和第20个用户的ID之和
#!/bin/bash
a="`head -n10 /etc/passwd | tail -n1 | cut -d: -f3`"
b="`head -n20 /etc/passwd | tail -n1 | cut -d: -f3`"
let c=a+b
 
posted @ 2019-03-14 16:55  美美的黑天鹅  阅读(1697)  评论(0编辑  收藏  举报