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 ...
随机推荐
- Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API的3环部分 一.R3环API分析的重 ...
- CEILING保留n位小数向上取整
number=3.1415926 CEILING(number*POWER(10,n))/POWER(10,n) 思路为:乘以10的n次方得到要保留的小数部分并转换为整数,再用CEILING向上取整, ...
- windows离线安装sublime插件:ctags
网络上一堆安装ctags教程,可都是在线安装. 花了点时间摸索出了离线安装教程. 1. 准备好sublime 和 package control sublime我用的版本是text 2. text 3 ...
- 基于powershell的socks代理
0x01 前言 在实战中,内网的代理尤其重要,而常见的端口转发被反病毒软件已经盯死,那么学习使用基于powershell的渗透脚本进行代理.端口转发的非常有必要的. 0x02 使用 介绍ithub: ...
- Cocos2d-x 学习笔记(9) Action 运行原理
1. 从一个Action开始 1.1 创建 在Scene里写一个Sprite,并添加Action: Sprite *sp = Sprite::create("m1.png"); M ...
- 真——Springcloud支持Https
很久不写了,因为一直没有一个项目的需求推动,担心写的东西可能不是太实际.其间学习的事倒是做了不少,设计模式.领域开发.Antlr.kubernetes等等,其实大部分都记在纸质笔记上了.. 基于对新技 ...
- c使用二叉链表创建二叉树遇到的一些疑问和思考
二叉链表存储二叉树 学习的时候参考的是<大话数据结构>,书中是这样定义的 typedef char TElemType; typedef struct BiTNode { TElemTyp ...
- Spring Boot入门(二):获取配置文件值
本篇博客主要讲解下在Spring Boot中如何获取配置文件的值. 1. 使用yaml配置文件 Spring Boot默认生成的配置文件为application.properties,不过它也支持ya ...
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
1. 前言 在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...
- 学习python3高阶函数笔记和demo
python的高阶函数的定义是:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数 举一个最简单的例子: def text(a,b,c): return c(a)+c(b) print( tex ...