12、bash脚本变量总结

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

时间: 2024-11-13 09:30:18

12、bash脚本变量总结的相关文章

bash脚本变量、变量类型

bash的变量类别有以下几类,区分好变量类别能让我们更好的理解bash基础: 本地变量(局部变量) 环境变量 特殊变量 位置变量 本地变量(局部变量) 作用域为整个bash进程.仅对当前shell进程有效,对子shell无效. 比较好理解的就是我复制了一个变量,我的子shell并不能够使用到这个变量 环境变量 作用域为当前shell进程及其子进程 查看环境变量的常用命令为:export env 特殊变量 $?:表示引用前一个命令的执行状态的返回值.在流程控制语句中判断条件都是执行状态返回值0为真

linux 笔记--扩展正则表达式,bash脚本—变量,条件判断,算术运算

正则表达式:有两类,一:basic regexp  二:extended(扩展正则表达式)  他们的部分元字符不一样,意义也不相同 grep:使用基本正则表达式或定义的模式中过滤文本的命令,-E;使用扩展正则表达式  -A 数字:不仅显示匹配到的行,还显示后面几行  -B 数字:不仅显示匹配到的行,还显示前几行  -C 数字:不仅显示匹配到的行,还显示前后个几行 扩展正则表达式: 其中 . [] [^] * ^ $ \< \>与grep是相同的, ? 与 \?:意思相同,可以不写\  +:其前

bash 脚本---变量

变量类型(事先定义好数据的存储格式和长度)     字符     数值          浮点型:11.23          整形     日期时间型     波尔型(真假) bash变量类型:(和进程相关)     环境变量     本地变量(局部变量)     位置变量 $1 $2 $3 $4 $5   对应 命令中给到的 第一个至 第五个                     shift  剔除掉最上面一个参数                      shift n  剔除n个上面的

菜鸟的Linux之路2 bash脚本编程之一

shell脚本编程 脚本编程是一种编程能力的体现. 编程语言分为以下几类: 1,机器语言 2,汇编语言 3,高级语言: (1)静态语言:编译型语言->强类型语言 强类型语言指的是变量的类型在程序执行前声明好,不能在程序执行过程中随意改变变量类型的语言. 强类型语言常见的有:C.C++.Java.C#等. 编译型语言在程序执行前会依靠编译器将程序全部转换成可执行的二进制格式. 编译型语言需要事先确定好变量类型,因为它没有解释器,解释器的机制可以帮助程序自动声明变量的类型. 强类型的语言,变量在使用

Linux基础之bash脚本编程初级-变量

什么是变量? 变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示.在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化.它指的是变量名+所指向的内存空间. 以下实验环境均在CentOS7.2进行 变量的特点 变量分强类型变量,与弱类型变量 强类型变量:变量需事先声明且需提前定义其变量存储格式 弱类型变量:不需事先声明,不需定义变量存储格式. bash把所有变量统统视作字符型:bash中的变量无需事先声明,相当于,把声明和赋值过程同时实现. 变量名的命名规范: 变量名只能包含

bash脚本编程之变量、变量类型、条件测试、算术运算、及特殊变量

一.学习目的 1.了解bash脚本的变量类型及变量的使用 2.了解bash中条件测试的种类及如何在bash中实现条件的判断 3.学会在bash中做算术运算 4.了解特殊变量的使用 二.学习内容 1). ①.bash的变量类型: 环境变量 .本地变量.局部变量.位置变量.特殊变量 环境变量: export VALUENAME = VALUE 作用领域是当前的shell进程及其子进程 本地变量: VALUENAME= VALUE 作用领域为整个bash的进程 局部变量:local VALUENAME

bash脚本的变量使用详解

变量的类型包括整数.字符串和数组,但在bash脚本编程中不需要指定类型就可以直接赋值,默认均为字符型,其参与运算会自动进行隐式类型转换. 变量的赋值方式为:name='value',其中"="两边一定不能有空格,如果变量值中包含有空格则需要使用引号引起来,需要注意的是强引用和弱引用的区分.此外变量的赋值也可以引用变量和命令,如果引用变量赋值需要使用双引号,如果引用命令赋值需要使用反向单引号.变量的引用需要使用"$"符号,如引用变量PATH:$PATH 或 ${PAT

bash脚本之一(变量+数组)

bash的变量与数组 变量:存储单个元素的内存空间: 也相当于是数组的0号索引.数组:存储多个元素的连续的内存空间: 一.变量 1.介绍: 任何程序都需要变量. 变量是用来存储数据的.程序=指令+数据.按照其变量是否需要严格定义其类型来划分 : 强类型语言: 简单讲就是严格区分变量类型,使用之前必须要声明一个变量的类型.如C.Python. 弱类型语言: 不强制区分变量的类型,在使用之前不用明确声明一个变量的类型,有默认的类型,一般默认是字符型的,用到时直接使用,直接赋值. 如:bash. 定义

bash脚本编程之一 变量、变量类型等

shell编程: shell:弱类型编程语言 强:变量在使用前,必须事先声明,甚至还需要初始 弱:变量用时声明,甚至不区分类型 bash变量类型: 环境变量 本地变量 位置变量 特殊变量 本地变量: VARNAME=VALUE:作用域为整个bash进程: 局部变量: local VARNAME=VALUE:作用域为当前代码段: 环境变量:作用域为当前shell进程及其子进程 export VARNAME=VALUE 位置变量: $1,$2,.... 特殊变量: $?:上一个命令的执行状态返回值: