[root@server ~]# JAVA_HOME=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64
[root@server ~]# SUM=0
[root@server ~]# back_up=/root
[root@server /]# vim test1.sh
x=123
let x+=1
echo "x=$x"
[root@server /]# vim test2.sh
a=1
b="hello"
c="hello world"
bak_dir=/mnt
[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b =5
bash: b: command not found...
[root@server ~]# stu_name=zhang san
bash: san: command not found...
[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'
[root@server ~]# a=1024
[root@server ~]# echo $a
[root@server ~]# echo ${a}
[root@server ~]# set | more
[root@server ~]# declare | more
# 法1
export 环境变量=值
# 法2
变量名=值
export 变量名
# 法3
declare -x 变量名=值
[root@server /]# export back_dir1=/home/fox
[root@server /]#
[root@server /]# NAME=zhangsan
[root@server /]# export NAME
[root@server /]#
[root@server /]# declare -x AGE=20
[root@server /]#
[root@server /]# env # 查看当前用户的环境变量
[root@server /]# printenv # 同上
[root@server /]# export # 同上
C语言 局部变量 全局变量
shell 自定义变量 环境变量
bash test1.sh hello world 123 456
当执行test1.sh 脚本时,第一个参数为hello到第四个参数可以使用特殊的符号表示,如:$1 $2 $3 ……
常见的位置变量
$0 : 脚本名
$1-$9 : 1-9个参数
${10} :10以上的参数需要大花括号括起
$* : 所有参数
$@ : 所有参数
$# : 参数个数
$$ : 当前进程的PID
$! : 上一个后台进程的PID
$? : 上一个命令的返回值状态码,0为成功
[root@server /]# vim test3.sh
#!/bin/bash
echo "第2个位置参数是: $2"
echo "第1个位置参数是: $1"
echo "第4个位置参数是: $4"
echo "所有参数是: $*" "1 2 3 4 5"
echo "所有参数是: $@" "1" "2" "3" "4" "5"
echo "参数个数是: $#"
echo "当前脚本的进程PID值: $$"
echo "当前脚本的文件名: $0"
[root@server /]# bash test3.sh 1 2 3 4 5
第2个位置参数是: 2
第1个位置参数是: 1
第4个位置参数是: 4
所有参数是: 1 2 3 4 5
所有参数是: 1 2 3 4 5
参数个数是: 5
当前脚本的进程PID值: 2378
当前脚本的文件名: test3.sh
[root@server /]# bash test3.sh a b c d e f g
第2个位置参数是: b
第1个位置参数是: a
第4个位置参数是: d
所有参数是: a b c d e f g
所有参数是: a b c d e f g
参数个数是: 7
当前脚本的进程PID值: 2379
当前脚本的文件名: test3.sh
当$* 和 $ @没有被引用的时候,它们确实没有什么区别,都会把位置参数当成一个个体, "$*"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"$* "为空,如果有两个位置参数并且IFS为空格时,"$*"相当于"$1 $2"
"$@"会把所有位置参数当成一个单独的字段,如果没有位置参数($#为0),则"$@"展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则"$@"相当于"$1",如果有两个参数,则"$@"相当于"$1" "$2"等等
[root@server /]# ip1=192.168.48.131
[root@server /]# school="Peking University"
[root@server /]# today1=`date +%F`
[root@server /]# today2=$(date +%F)
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
格式:read -参数 变量名
参数
read 变量名
read -p "提示信息:" 变量名
[root@server ~]# read -p "enter numbers: " num
enter numbers: 123
[root@server ~]# echo $num
123
[root@server ~]# read -t 3 n1 # 等待3秒未输入则结束输入
[root@server ~]# read -s -p "enter your password: " psd
enter your password: [root@server ~]#
[root@server ~]# echo $REPLY
[root@server ~]# read
200
[root@server ~]# echo $REPLY # 当输入时没有变量接收则会存储到环境变量REPLY
中
200
[root@server ~]# read t1 t2 # 一次输入多个数据
12 35
[root@server ~]# echo $t1 $t2
12 35
全局变量:全局变量定义在脚本中,也可以定义在函数中,作用范围:从定义的开始处到shell脚本结束或者被显示的去除
例:
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定义函数
{
echo "$v1"
v1=200
}
v1=100
func
echo "$v1"
[root@server ~]# bash test5.sh
100
200
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定义函数
{
v2=200
}
func
echo "$v2"
[root@server ~]# bash test5.sh
200
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func() # 定义函数
{
local v3=200 # 使用local关键字声明为局部变量
}
func
echo "$v3"
[root@server ~]# bash test5.sh
# 上例修改
[root@server ~]# vim test5.sh
#!/bin/bash
func()
{
#输出全局变量v1的值
echo "global variable v1 is $v1"
#定义局部变量v1
local v1=2
#输出局部变量v1的值
echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo "global variable v1 is $v1"
[root@server ~]# expr 1 + 1 # 运算符左右要有空格
2
[root@server ~]# expr 1+1
1+1
[root@server ~]# a=1
[root@server ~]# b=2
[root@server ~]# expr $a + $b
3
[root@server ~]# expr a + b
expr: 非整数参数
[root@server ~]# echo $((1+2))
3
[root@server ~]# echo $((a+b))
3
[root@server ~]# $((1+2)) # expr等价与echo+(())
bash: 3: command not found...
[root@server ~]# echo $((1+2))
3
[root@server ~]# echo $((5/2))
2
[root@server ~]# echo $((5%3))
2
[root@server ~]# echo $((3%5))
3
[root@server ~]# echo $((50%30))
20
[root@server ~]# echo $((1-5))
-4
[root@server ~]# echo $((2,5+5))
10
[root@server ~]# echo $((2.5+5)) # (())不支持小数
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")
[root@server ~]# echo $[2+5]
7
[root@server ~]# echo $[2.5+5]
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")
[root@server ~]# bc # bc计算器
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2
3
2-5
-3
5/2
2
1.5+3.6
5.1
5>3
1
3>5
0
quit # 退出交互模式
例2:
[root@server ~]# str1="hello world"
[root@server ~]# echo ${#str1} # 计算变量的串长度
11
# 变量值截取
[root@server ~]# echo ${str1:0:3} # 从左边第一个字符开始截取3个字符
hel
[root@server ~]# echo ${str1::3} # 同上,0可以省略
hel
[root@server ~]# echo ${str1:1} # 从下标1字符开始截取到尾部
ello world
[root@server ~]# echo ${str1:0-1:1} # 从右侧第一个字符开始截取1个,左边为0,右边为0-1 0-2 等
d
[root@server ~]# echo ${str1:0-2:1}
l
[root@server ~]# echo ${str1:0-5} # 从右侧数第5个字符截取到尾部
[root@server ~]# echo ${str1: -5} # 使用空格替代0
world
[root@server ~]# echo ${str1:-5} # 无空格提取整串
hello world
# 使用%截取字符串,含义:删除右边字符,保留左边字符
[root@server ~]# filename=testfile.tar
# %. 表示从右边开始检索第一次出现的点 , 检索到后删除右侧,保留左侧
[root@server ~]# file=${filename%.*}
[root@server ~]# echo $file
testfile
# 作用:保留左边内容,用于截取文件的主文件名,去掉扩展名
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%%:*} # %%表示从右向左检索最后一次出现的冒号,删除右侧保留左侧内容
[root@server ~]# echo $ul1
http
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url#*.} # #*.表示左向右检索第一次出现的点,删除左边,保留右边
[root@server ~]# echo $ul1
baidu.com/index.html
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%/*} # %/* 表示从右向左检索第一次出现的/删除右侧保留左侧
[root@server ~]# echo $ul1
http://www.baidu.com
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url##*/} # ##*/ 表示左向右检索最有一次出现的/删除左边保留右边
[root@server ~]# echo $ul1
index.html