BASH 编程之变量高级篇
内部变量
[root@oracle ~]# echo $BASHPID #没有结果??
[root@oracle ~]# echo $$ #显示执行进程的 id 号 [root@oracle ~]# ps ax | grep bash
? Ss : /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c
"/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients"
pts/ Ss+ : bash
? S : /bin/bash /usr/bin/eio
pts/ Ss : bash
pts/ R+ : grep bash
位置参数
#!/bin/bash
[ ! -n "$1" ] && echo -e "wrong\nusage : $0 canshu1 " && exit - || echo "right"
#-n 测试参数的长度是否为 ,不为 则返回 ,表示 true
测试:
[root@oracle ~]# ./f2.sh 没有接参数
wrong
usage : ./f2.sh canshu1
[root@oracle ~]# echo $? [root@oracle ~]# ./f2.sh ff 接了参数
right
[root@oracle ~]# echo $?
、$#
#!/bin/bash
in=
for arg in "$#"
do
echo "arg $in = $arg"
let "in=in+1"
done
测试结果:$#表示参数总数
[root@oracle ~]# ./f1.sh a b c
arg =
、$*
#!/bin/bash
in=
for arg in "$*"
do
echo "arg $in = $arg"
let "in=in+1"
done
测试:$*参数以一行显示
[root@oracle ~]# ./f1.sh a b c
arg = a b c
、$@
#!/bin/bash
in=
for arg in "$@"
do
echo "arg $in = $arg"
$((in+=))
done
测试:$@参数以空格为分隔
[root@oracle ~]# ./f1.sh a b c
arg = a
arg = b
arg = c
强制退出程序本身
[root@oracle ~]# vim &\
> { sleep ;
> eval 'kill -9 $!' &> /dev/null;
> }
[]
#停了 秒
[]+ Stopped vim
You have new mail in /var/spool/mail/root
[root@oracle ~]#
[]+ 已杀死 vim
字符长度
#!/bin/bash
echo -e "please input you id:"
read string
#ln=${#string} #这 句注释掉的和下面的那句起同样的作用
#ln=$( expr "$string" : '.*')
ln=$( expr length $string )
((ln < )) && echo "$string shi fei fa de id hao" || echo " id $string shi he fa de "
表达式方式取长度
[root@desktop Desktop]# num=1234HHHjjj123
[root@desktop Desktop]# echo $num
1234HHHjjj123
[root@desktop Desktop]# echo ${num}
1234HHHjjj123
[root@desktop Desktop]# echo ${#num}
符号提取
[root@oracle ~]# stringZ=123aaa123bbb456ccc
不要前面 个字符:
[root@oracle ~]# echo ${stringZ:}
123bbb456ccc
从编号为 的字符,即第 个字符开始,提取 个字符
[root@oracle ~]# echo ${stringZ::}
aaa123
函数提取
[root@oracle ~]# stringZ=123aaa123bbb456ccc
从第 个字符即 a 开始提取 个字符:
[root@oracle ~]# echo `expr substr $stringZ `
a123bb
[root@desktop Desktop]# SN=WINDD20110908DDSL
[root@desktop Desktop]# echo ${SN::}-${SN::}-${SN::}
--
前面提取字符串
[root@oracle ~]# echo `expr match "$stringZ" '\(123[a-z]..[1-9]*\)'`
123aaa123
[root@oracle ~]# echo `expr "$stringZ" : '\(123[a-z]..[1-9]*\)'`
123aaa123
后面提取字符串
[root@oracle ~]# echo `expr "$stringZ" : '.*\([a-z]...\)'`
b456
前面字符串移除
[root@oracle ~]# echo "${stringQ#q*w}" 最短匹配
w20081010aabb
[root@oracle ~]# echo "${stringQ##q*w}" 最长匹配
20081010aabb
[root@desktop Desktop]# cat /boot/grub/grub.conf |grep kernel|grep 2.6 |cut
-d ' ' -f
/vmlinuz-2.6.-.el6.x86_64
[root@desktop Desktop]# VV=$(cat /boot/grub/grub.conf |grep kernel|grep 2.6
|cut -d ' ' -f )
[root@desktop Desktop]# echo ${VV#/[a-z]*-}
2.6.-.el6.x86_64
后面字符串移除
[root@oracle ~]# echo "${stringQ%0*b}" 从后面最短匹配
qqww2008101
[root@oracle ~]# echo "${stringQ%%0*b}" 从后面最长匹配
qqww2
#!/bin/bash
DIR=$
fix="TXT txT tXt tXT Txt TXt TxT"
for LINE in $fix
do
old=$LINE
new=txt
for FILE in $(find $DIR -name "*.$old")
do
mv -v $FILE ${FILE%$old}$new
done
done
测试:
[root@desktop Desktop]# ./chname.sh ./
`./.TXT' -> `./2.txt'
`./.TXT' -> `./3.txt'
`./.TXT' -> `./1.txt'
表达式方式字符串替换
参数替换
N 声明了,只是没有设置参数
[root@desktop Desktop]# N=
[root@desktop Desktop]# N1=qq
[root@desktop Desktop]# echo "${N-dd}" 没有设置参数的 N 没被替换
You have new mail in /var/spool/mail/root
[root@desktop Desktop]# echo "${N:-dd}" 没有设置参数的 N 被替换
dd
[root@desktop Desktop]# echo "${N1-dd}" 设置了参数的 N1 没被替换
[root@desktop Desktop]# echo "${N1:-dd}" 设置了参数的 N1 没被替换
没有声明的 N2,被默认值替换
[root@desktop Desktop]# echo "${N2-dd}"
dd
[root@desktop Desktop]# echo "${N2:-dd}"
dd
[root@desktop Desktop]# M=
[root@desktop Desktop]# M1=rr
[root@desktop Desktop]# echo "${M=aa}"
[root@desktop Desktop]# echo "${M:=aa}"
aa
[root@desktop Desktop]# echo "${M1=aa}"
rr
[root@desktop Desktop]# echo "${M1:=aa}"
rr
[root@desktop Desktop]# echo "${M2=aa}"
aa
[root@desktop Desktop]# echo "${M2:=aa}"
aa
[root@desktop Desktop]# H=
[root@desktop Desktop]# H1=oo
[root@desktop Desktop]# echo "${H+yy}"
yy
[root@desktop Desktop]# echo "${H:+yy}"
[root@desktop Desktop]# echo "${H1+yy}"
yy
[root@desktop Desktop]# echo "${H1:+yy}"
yy
[root@desktop Desktop]# echo "${H2+yy}"
[root@desktop Desktop]# echo "${H2:+yy}"
错误检测
综合练习
实例 :
echo `basename $PWD` # 打印当前工作路径最后一段子目录名字
echo "${PWD##*/}" # 另一种方法的实现
echo `basename $` # 得到脚本的名字
echo $ # 另一种方法的实现
echo "${0##*/}" # 另一种方法的实现
filename=test.data
echo "${filename##*.}" # 移除"."之前的内容,得到 data 文件名的后缀
实例 :
下面的例子实现将特定的文件名后缀,比如 .gif 统统改为其他后缀
for filename in *.$ # 遍历当前整个目录中所有指定的文件后缀
do
mv $filename ${filename%$}$
#去除掉输入的文件名后缀再追加另外指定的一个
done
exit
实例 :
path_name=/home/bozo/ideas/thoughts.for.today
echo "path_name = $path_name"
t=${path_name##/*/} # 根据表达式最大可能的移除/部分,最后只留下文件名
echo "path_name, stripped of prefixes = $t"
t=${path_name%/} ; t=${t##*/}; # 同样的效果
实例 :下面的例子将一个用户 yangwawa 主目录的文件拷贝到另一个用户 joe(可以用$代替写在脚本中)的主目录中FILENAME=/home/yangwawa/.bash_profile
cp -v $FILENAME{,${FILENAME/yangwawa/joe}}
提取目录中的文件名:
[root@desktop Desktop]# FILENAME=/etc/sysconfig/network-scripts/ifcfg-eth0
[root@desktop Desktop]# basename $FILENAME
ifcfg-eth0
[root@desktop Desktop]# echo ${FILENAME##*/}
ifcfg-eth0
[root@desktop Desktop]# echo ${FILENAME%/*}
/etc/sysconfig/network-scripts
拼接目录:
[root@desktop Desktop]# BACK_DIR=/usr/local/share
[root@desktop Desktop]# echo $BACK_DIR/${FILENAME##*/}
/usr/local/share/ifcfg-eth0
替换文件路径中目录的名字:
[root@desktop Desktop]# FILENAME=/home/student/.mozilla/firefox/profiles.ini
[root@desktop Desktop]# echo ${FILENAME/student/visitor}
/home/visitor/.mozilla/firefox/profiles.ini
定义一个变量
declare 显示变量
数组概述
数组使用
#!/bin/bash
declare -a BOOKS
BOOKS[]="Windows 2007"
BOOKS[]="Windows xp"
BOOKS[]="Oracle"
BOOKS[]="IBM ATX 5"
BOOKS[]="RedHat"
echo "${BOOKS[@]}" #将数组作为一串字符打印出来
echo ++++++++++++++++++++++
TOTAL=${#BOOKS[@]} #以空格为依据取字符串的长度
for ((X_B=;X_B<TOTAL;X_B++))
do
echo "$X_B --> ${BOOKS[$X_B]}"
done
测试:
[root@desktop Desktop]# chmod u+x showbooks.sh
[root@desktop Desktop]# ./showbooks.sh
Windows Windows xp Oracle IBM ATX RedHat
++++++++++++++++++++++
--> Windows
--> Windows xp
--> Oracle
--> IBM ATX
--> RedHat
BASH 编程之变量高级篇的更多相关文章
- bash编程-Shell变量
bash中,所有变量的值默认均为字符串. 1. 变量操作 调用变量 $变量 查看变量(所有类型) set 删除变量 unset 变量 2. 变量分类 2.1 自定义变量 自定义变量仅对当前Shell有 ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
- Bash 脚本编程的一些高级用法
概述 偶然间发现 man bash 上其实详细讲解了 shell 编程的语法,包括一些很少用却很实用的高级语法.就像发现了宝藏的孩子,兴奋莫名.于是参考man bash,结合自己的理解,整理出了这篇文 ...
- 脚本编程中的test、bash调试、变量计算、参数
脚本编程中的test.bash调试.变量计算.参数 1.文件测试 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试路径是否为目录 -r FILE:测试当前 ...
- (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Kotlin——从无到有系列之高级篇(一):Lambda表达式
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 经过前面一系列对K ...
- 常见 Bash 内置变量介绍
目录 $0$1, $2 等等$#$* 与 "$*"$@ 与 "$@"$!$_$$$PPID$?$BASH$BASH_VERSION$EUID 与 $UID$GR ...
- 大数据系列博客之 --- 深入简出 Shell 脚本语言(高级篇)
首先声明,此系列shell系列博客分为四篇发布,分别是: 基础篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cn ...
- Bash拾遗:变量
使用引号包裹变量 在<高级Bash脚本编程指南>中的4.1节中有这么个例子: hello="A B C D" echo $hello # A B C D echo &q ...
随机推荐
- 移动端网页常用meta
今天在对前公司的某直播室前端进行改版时,整理了一下平时移动端页面开发时,最常用的meta.如下: <!--定义页面制作者,可以留姓名,也可以留联系方式--> <meta name=& ...
- 解决 canvas 将图片转为base64报错: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasEleme...
问题描述 当用户点击分享按钮时,生成一张海报,可以保存图片分享到朋友圈,用户的图片是存储在阿里云的OSS,当海报完成后,执行.canvas.toDataURL("image/png" ...
- windows显示文件后缀名
win+E 进入到计算机 点击组织 点击文件夹和搜索选项 先点击查看,然后去掉勾选隐藏已知文件类型的扩展名
- Did You AK Today? (今天你AK了吗?)
考虑到本文读者年龄原因,本文改为使用简体中文撰写. 题目描述 今有正整数 n,kn,kn,k,求 1−n1-n1−n 共 nnn 个数的全排列,按字典序的第 kkk 个. 数据满足 1≤n≤105,1 ...
- [BZOJ1116] CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1311 Solved: 709[Submit][Status] ...
- php函数分为哪两种?
PHP的真正威力源自于它的函数.函数分为内置函数和自定义函数. 内置函数 所谓PHP内置函数,就是在php程序的库里面已经定义了的函数,比如echo,mysql_connect,include_onc ...
- 微信小程序实现九宫格切图,保存功能!
效果如下图: 代码如下: <view class='sudoku'> <scroll-view scroll-x scroll-y class='canvas-box'> &l ...
- ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口
目录 ① 存储角色/用户所能访问的 API ② 实现 IAuthorizationRequirement 接口 ③ 实现 TokenValidationParameters ④ 生成 Token ⑤ ...
- vue-property-decorator用法
vue-property-decorator这个库完全依赖于vue-class-component,所以在使用这个库之前请先阅读它, 不管啥反正都是装饰器而已 vue-property-decorat ...
- 雷子聊并发编程(001):基础知识之串行&并行&并发
前言 编写正确的程序很难,而编写正确的并发程序则难上加难.与串行程序相比,在并发程序中存在更多容易出错的地方.那么,为什么还要编写并发程序?原因很简单,能充分发挥与利用多处理器系统的强大计算能力. 在 ...