bash编程之变量(我们现在要总结了)
1、bash的内置变量:全大写的,如下的一些变量
PATH PS1 HOSTNAME UID HISTFILE HISTSIZE HISTEILESIZE HISTCONTROL(命令是如何保存在命令历史中的)
$BASH:bash二进制程序文件的路径
$BASH_SUBSHELL:子shell的层次
$BASH_VERSION(bash的4以后支持数组关联的)
$EDITOR:默认编辑器
$EUID:有效的用户ID
[[email protected] ~]# echo $EUID
0
[[email protected] ~]$ echo $EUID
503
$UID:当前用户的ID号
$FUNCNAME:当前函数的名称
$GROUPS:当前用户显示的组
$HOME:当前用户的家目录
$HOSTTYPE:主机架构类型,用来识别系统硬件
$MACHTYPE:平台类型,系统平台依赖的编译平台
[[email protected] ~]$ echo $MACHTYPE
x86_64-redhat-linux-gnu
[[email protected] ~]$ echo $HOSTTYPE
x86_64
[[email protected] ~]$ echo $OSTYPE
linux-gnu
$OSTYPE:OS系统类型
$IFS(内部的域分隔符):输入数据时的字段分隔符,默认是空白符(空格、制表符、换行符)
$OLDPWD:上次使用的目录
$PWD:当前目录
$PPID:父进程
$PS1:主提示符
$PS2:第二提示符,主要用于补充完全命令输入时的提示符
$PS3:第三提示符,用于select命令(这个是菜单生成器)中
$PS4:第四提示符,当使用-X选项调用脚本时,显示的提示符,默认为+号
$SECONDS:当前脚本(当前shell)已经运行的时长
[[email protected] ~]# echo $SECONDS
10
[[email protected] ~]# echo $SECONDS
11
$SHLVL:shell的级别。bash别嵌入的深度
2、特殊变量:br/>$0:脚本名称自身
$1,$2。。。。:位置参数
$#:命令行参数个数
$*:所有的参数,被当作一个字符串
[email protected]:所有的参数,每个参数都是一个独立的字符串
$-:传递给脚本的标记
$!:运行于后台的最后一个作业的PID
$_:上一条命令的最后一个参数的值
$?:上一条命令状态的返回值
$$:脚本自身的PID
bashell就会推出了
操作变量:
${#var} :返回变量中字符串的长度
${var}:变量引用(变量替换的),这个用的是比较多的
${var:-default}:如果var没有声明或者为空,则返回default字串,否则返回var自身的值
${var:+default}:如果var没有声明或者为空,则返回空字串,否则返回default的值
${var:=default}:如果var没有声明或者为空,则返回default字串,并且将default赋值给var,否则返回var自身的值
${var:?default}:如果var没有声明或者为空,则以default为错误信息返回,否则
返回var自身的值
[[email protected] ~]# name=jerry
[[email protected] ~]# echo ${name:?tom}
jerry
[[email protected] ~]# unset name
[[email protected] ~]# echo ${name:?tom}
-bash: name: tom
[[email protected] ~]#
子串削除:
${varilable#pattern}: 查找variable中自左而右第一次被pattern匹配到的串,将此串及向左的所有内容都删除
${varilable##pattern}: 查找variable中自左而右最后一次被pattern匹配到的串,将此串及向左的所有内容都删除
${varilable%pattern}:查找variable中自右而左第一次被pattern匹配到的串,将此串及向右的所有内容都删除
${varilable%%pattern}:查找variable中自右而左最后一次被pattern匹配到的串,将此串及向右的所有内容都删除
字串消除取子串:
${variable:pos}: 偏移pos个字符,取余下的子串
name=jerry, ${name:2}结果为rry
${variable:pos:num}: 偏移pos个字符,取num个字符长度的子串
name=‘hello world‘, ${name:2:5}结果为“llo w”
字符串处理,将来在bash中经常用的
bash能力分为三个最为重要:
字符串能力
grep,awk,sed
脚本整体的框架能力
${var#word}:查找var中自左而右第一个被word匹配到的串,并将此串及向左的所有内容都删除
${var#word}:查找var中自左而右最后一次被word匹配到的串,并将此串及向左的所有内容都删除
${var%word}:查找var中自右而左第一个被word匹配到的串,并将此串及向右的所有内容都删除
${var%%word}:查找var中自右而左最后一次被word匹配到的串,并将此串及向右的所有内容都删除
取字串:
${var:pos}:偏移pos个字符,取余下的字串
name=jerry,${name:2}结果为rry
${var:pos:num}偏移pos个字符,取num个字符长度的字串
name=‘hello world‘ ${name:2:5}结果为llo w
子串替换
${var/Pattern/Replaceplacement} :以Pattern为模式匹配var中的字串,将第一次匹配到的替换为Replaceplacement
${var//Pattern/Replaceplacement} :以Pattern为模式匹配var中的字串,将全部匹配到的替换为Replaceplacement6
声明变量:(bash中不声明变量也是可以使用过的,但是声明的话,声明的位置,决定了他的作用域)
declare
-i:×××
-a:数值
-x:环境变量
-r:只读变量,不能撤销,不能修改,相当于readonly命令(a=3 ; readonly a)
-f:声明函数
OpenSSH:
ssh OpenSSH
安装配置dropbear(在嵌入式系统使用,轻量级的,能够远程的,功能比较强大)
可以代替Openssh
1.编译安装
tar
cd
./configure
make PROGRMS="dropbear dbclient dropberkey scp"
make PROGRMS="dropbear dbclient dropberkey scp" install
make clean(可以清楚此前编译的结果的)
2.服务脚本
/etc/rc.d/init.d/dropbear
#!/bin/bash
#
description: dropbear ssh daemon
chkconfig: 2345 66 33
#
dsskey=/etc/dropbear/dropbear_dss_host_key
rsakey=/etc/dropbear/dropbear_rsa_host_key
lockfile=/var/lock/subsys/dropbear
pidfile=/var/run/dropbear.pid
dropbear=/usr/local/sbin/dropbear
dropbearkey=/usr/local/bin/dropbearkey
[ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/dropbear ] && . /etc/sysconfig/dropbear
keysize=${keysize:-1024}
port=${port:-22}
gendsskey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the dss key: "
$dropbearkey -t dss -f $dsskey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
success
echo
return 0
else
failure
echo
return 1
fi
}
genrsakey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the rsa key: "
$dropbearkey -t rsa -s $keysize -f $rsakey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
success
echo
return 0
else
failure
echo
return 1
fi
}
start() {
[ -e $dsskey ] || gendsskey
[ -e $rsakey ] || genrsakey
if [ -e $lockfile ]; then
echo -n "dropbear daemon is already running: "
success
echo
exit 0
fi
echo -n "Starting dropbear: "
daemon --pidfile="$pidfile" $dropbear -p $port -d $dsskey -r $rsakey
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch $lockfile
return 0
else
rm -f $lockfile $pidfile
return 1
fi
}
stop() {
if [ ! -e $lockfile ]; then
echo -n "dropbear service is stopped: "
success
echo
exit 1
fi
echo -n "Stopping dropbear daemon: "
killproc dropbear
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f $lockfile $pidfile
return 0
else
return 1
fi
}
status() {
if [ -e $lockfile ]; then
echo "dropbear is running..."
else
echo "dropbear is stopped..."
fi
}
usage() {
echo "Usage: dropbear {start|stop|restart|status|gendsskey|genrsakey}"
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
stop
start
;;
status)
status
;;
gendsskey)
gendsskey
;;
genrsakey)
genrsakey
;;
*)
usage
;;
esac
3配置文件位置/etc/sysconfig/dropbear
keysize=2048
port=22022
4后配置
chmod +x /etc/rc.d/init.d/dropbear
chkconfig -add dropbear
变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值
可以使用的变量替换形式:
形式 说明
${var} 变量本来的值
${var:-word} 如果变量 var 为空或已被删除(unset),那么返回?word,但不改变?var 的值。
${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。
获取字符串长度
string="abcd"
echo ${#string}#输出 4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4}#输出liba
查找子字符串
string="alibaba is a great company"
echo expr index "$string" is
取得数组元素的个数
length=${#array_name[@]}
或者
length=${#array_name[*]}
取得数组单个元素的长度
lengthn=${#array_name[n]}
实例
#!/bin/bash
name[0]="Zadffrasdfsdaa"
name[1]="Qadsadfir"
name[2]="Mahnaasdsdfz"
name[3]="Aysdafsdan"
name[6]="Daiswwey"
name[7]="Daisery"
name[8]="Daisergy"
name[9]="Daaaisy"
echo "First Index: ${name[0]}"
echo "Second Index: ${name[1]}"
echo "${name[]}"
length=${#name[]}
echo $length
lengthn=${#name[n]}
echo $lengthn
[[email protected] tmp]# ./5.sh
First Index: Zadffrasdfsdaa
Second Index: Qadsadfir
Zadffrasdfsdaa Qadsadfir Mahnaasdsdfz Aysdafsdan Daiswwey Daisery Daisergy Daaaisy
8
14 获取的是属组的第一个字符串的长度
显示不换行
echo "OK!\c"
echo "It is a test"
输出:
OK!It si a test
来看一个带有return语句的函数:
函数返回值在调用该函数后通过 $? 来获得
函数
#!/bin/bash
funWithReturn(){
echo "The function is to get the sum of two numbers..."
echo -n "Input first number: "
read aNum
echo -n "Input another number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
Capture value returnd by last command
ret=$?
echo "The sum of two numbers is $ret !"
[[email protected] tmp]# ./7.sh
The function is to get the sum of two numbers...
Input first number: 6
Input another number: 9
The two numbers are 6 and 9 !
The sum of two numbers is 15 !
再来看一个函数嵌套的例子:
#!/bin/bash
Calling one function from another
number_one () {
echo "Url_1 is http://see.xidian.edu.cn/cpp/shell/"
number_two
}
number_two () {
echo "Url_2 is http://see.xidian.edu.cn/cpp/u/xitong/"
}
number_one
运行结果:
Url_1 is http://see.xidian.edu.cn/cpp/shell/
Url_2 is http://see.xidian.edu.cn/cpp/u/xitong/
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
带参数的函数示例:
#!/bin/bash
funWithParam(){
echo "The value of the first parameter is $1 !"
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is $10 !"
echo "The value of the tenth parameter is ${10} !"
echo "The value of the eleventh parameter is ${11} !"
echo "The amount of the parameters is $# !"# 参数个数
echo "The string of the parameters is $* !"# 传递给函数的所有参数
}
funWithParam 1234567893473
运行脚本:
The value of the first parameter is 1 !
The value of the second parameter is 2 !
The value of the tenth parameter is 10 !
The value of the tenth parameter is 34 !
The value of the eleventh parameter is 73 !
The amount of the parameters is 12 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !"
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊变量用来处理参数,前面已经提到:
特殊变量 说明
$# 传递给函数的参数个数。
$ 显示所有传递给函数的参数。
[email protected] 与$相同,但是略有区别,请查看Shell特殊变量。
$? 函数的返回值。
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
Shell 中包含脚本可以使用:
. filename
或
source filename
两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
例如,创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:
url="http://see.xidian.edu.cn/cpp/view/2738.html"
一个是主文件 main.sh,内容如下:
#!/bin/bash
../subscript.sh
echo $url
执行脚本:
$chomd +x main.sh
./main.sh
http://see.xidian.edu.cn/cpp/view/2738.html
$
注意:被包含脚本不需要有执行权限。
原文地址:http://blog.51cto.com/425319153/2092875